前言
PHP提供了错误处理和日志记录的功能. 这些函数允许你定义自己的错误处理规则,以及修改错误记录的方式. 这样,你就可以根据自己的需要,来更改和加强错误输出信息以满足实际需要。
通过日志记录功能,你可以将信息直接发送到其他日志服务器,或者发送到指定的电子邮箱(或者通过邮件网关发送),或者发送到操作系统日志等,从而可以有选择的记录和监视你的应用程序和网站的最重要的部分。
错误报告功能允许你自定义错误反馈的级别和类型,可以是简单的提示信息或者使用自定义的函数进行处理并返回信息。
error:
不能在编译期发现的运行期错误,不如试图用 echo 输出一个未赋值的变量,这类问题往往导致程序或逻辑无法继续下去而需要中断;
exception:
程序执行过程中出现意料之外的情况,逻辑上往往是行得通的,但不符合应用场景,比如接收到一个长度超出预定格式的用户命名,因此,异常主要靠编码人员做预先做判断后抛出,捕获异常后改变程序流程来处理这些情况,不必中断程序。
参考文献
PHP官方文档:https://www.php.net/manual/zh/book.errorfunc.php
Exception预定义异常:https://www.php.net/manual/zh/class.exception.php
错误处理函数:https://www.php.net/manual/zh/ref.errorfunc.php
示例演示
try-catch
try-catch捕获异常
<?php
try {
throw new Exception('an error'); // 抛出异常
// you codes that maybe cause an error
}catch(\Exception $e){ // 这个错误对象需要声明类型, Exception 是系统默认异常处理类
echo $e->getMessage().PHP_EOL;
var_dump($e->getCode());
}
// 输出
//an error int(0)
try-catch扩展catch子句
<?php
// ErrorException:用set_error_handler()函数将错误信息托管至ErrorException。是 PHP 5 增加的异常类以便将错误封装为异常,可以更好地处理错误信息,继承于 Exception。
// 自定义错误类
class MyException extends Exception{
public $errType = 'default';
public function __construct($errType=''){
$this->errType = $errType;
}
}
// 测试实例
try{ // you codes that maybe cause an error
throw new MyException('My an error');
}catch(MyException $err){ // 这个错误对象需要声明类型
echo $err->errType.PHP_EOL;
}catch(ErrorException $e){
echo 'error !'.$e->getMessage().PHP_EOL;
}catch(Exception $e){
echo $e->getMessage().PHP_EOL;
}
// 输出
// My an error
Exception异常的回调函数
error_log
error_log() 函数向服务器错误记录、文件或远程目标发送一个错误。如果成功该函数返回 TRUE,如果失败该函数返回 FALSE。
<?php
$test=2;
if ($test>1) {
error_log("触发自定义错误",1,"someone@example.com","From: webmaster@example.com");
}
set_error_handler 自定义错误处理函数
该函数用于创建运行期间的用户自己的错误处理方法。该函数返回旧的错误处理程序,如果失败则返回 NULL
<?php
//error handler function
function customError($errno, $errstr, $errfile, $errline)
{
echo "<b>Custom error:</b> [$errno] $errstr<br />";
echo " Error on line 错误行数 $errline in $errfile<br />";
echo "Ending Script";
die();
}
//set error handler
set_error_handler("customError");
$test=2;
//trigger error
if ($test>1) {
trigger_error("出发自定义错误");
}
/*
输出
Custom error: [1024] 出发自定义错误
Error on line 错误行数 18 in F:\www\aaa.php
Ending Script
*/
set_exception_handler 自定义异常处理函数
该函数用于创建运行期间的用户自己的异常处理方法。该函数返回旧的异常处理程序,如果失败则返回 NULL。
<?php
function myException($exception) {
echo "<b>Exception:</b> " , $exception->getMessage();
}
set_exception_handler('myException');
throw new Exception('自定义异常处理返回');
/*
返回:
Exception: 自定义异常处理返回
*/
error_get_last 获得最后发生的错误
该函数以数组的形式返回最后发生的错误。如果没有错误发生则返回 NULL
<?php
echo $test + $abc;
print_r(error_get_last());
/*
输出
Array ( [type] => 8 [message] => Undefined variable: abc [file] => F:\www\aaa.php [line] => 2 )
*/
register_shutdown_function 注册一个会在php中止时执行的函数
注册一个 callback
,它会在脚本执行完成或者 exit() 后被调用。
<?php
function shutdown()
{
// This is our shutdown function, in
// here we can do any last operations
// before the script is complete.
echo 'Script executed with success', PHP_EOL;
}
register_shutdown_function('shutdown');