PHP 提供了错误处理函数。它们允许我们定义自己的错误处理规则。这也使我们能够更改和增强错误报告以满足我们的需求。错误报告函数允许我们自定义给出错误反馈的级别和类型,范围从简单的通知到错误期间返回的自定义函数。
定义自定义错误处理函数
PHP set_error_handler()函数用于设置用户自定义的错误函数来处理脚本中的错误。
该函数用于定义处理方式用户在运行时发生的错误,例如在应用程序中,当发生严重错误时,或者当您需要在某些条件下触发错误时,您需要清理数据/文件。
标准 PHP 错误对于 error_levels 指定的错误类型,处理程序将被完全绕过,除非回调函数返回 false。如有必要,用户定义的错误处理程序必须终止脚本 die()。 error_reporting() 设置对此函数没有影响,并且无论如何都会调用该函数 - 但是用户仍然能够读取 error_reporting 的当前值并采取适当的操作。
以下错误类型不能使用用户定义的函数处理:E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING,无论它们在何处引发,并且大多数 E_STRICT 在调用此函数的文件中引发。
如果之前发生错误脚本执行后,无法调用自定义错误处理程序,因为当时尚未注册。
语法
set_error_handler(callback, error_levels)
参数
callback | 必填。 使用以下签名指定函数。可以改为传递 null,以将此处理程序重置为其默认状态。除了函数名之外,还可以使用包含对象引用和方法名的数组。
如果函数返回 false,则正常错误处理程序继续。 |
error_level | 可选。 指定当前脚本的error_reporting级别。它采用位掩码或预定义常量中描述的命名常量。建议使用命名常量以确保未来版本的兼容性。默认值为"E_ALL"。 |
返回值
返回先前定义的错误处理程序(如果有)。如果使用内置错误处理程序,则返回 null。如果前面的错误处理程序是类方法,则此函数将返回一个包含类和方法名称的索引数组。
示例:set_error_handler() 示例
下面的示例显示set_error_handler() 函数的用法。
<?php
//用户定义的错误处理函数
function myErrorHandler($errno, $errstr, $errfile, $errline) {
echo "<b>My ERROR</b> [$errno] $errstr<br>\n";
echo "Error on line $errline in file $errfile<br>\n";
echo "Aborting...<br>\n";
}
//设置用户自定义错误处理函数
set_error_handler("myErrorHandler");
$test = 100;
//触发用户定义的错误处理函数
if ($test==100) {
trigger_error("A custom error has been triggered");
}
?>
上述代码的输出将是:
My ERROR [1024] A custom error has been triggered
Error on line 20 in file index.php
Aborting...
定义自定义异常处理函数
PHP set_exception_handler() 函数用于设置用户定义的异常处理函数。调用异常处理程序后,脚本将停止执行。
语法
set_exception_handler(callback)
参数
callback | 必填。 指定发生未捕获异常时要调用的函数名称。 该处理函数需要一个参数,该参数是抛出的异常对象。在 PHP 7 之前,该处理函数的签名为:
自 PHP 7 以来,大多数错误都是通过抛出 Error 异常来报告的,该异常也会被处理程序捕获。 Error 和 Exception 都实现了 Throwable 接口。从 PHP 7 开始,该处理函数的签名为:
可以传递 NULL 将此处理函数重置为其默认状态。 |
返回值
返回先前定义的异常处理程序,或出现错误时返回 null。如果之前没有定义处理程序,也会返回 null。
示例:set_exception_handler() 示例
下面的示例显示了 set_exception_handler() 函数的用法.
<?php
//两个用户定义的异常处理函数
function myException($e) {
echo "Exception: ".$e->getMessage();
}
//设置用户定义的异常处理函数
set_exception_handler("myException");
//抛出异常
throw new Exception("Uncaught exception occurred!");
echo "This will not be executed.\n";
?>
上述代码的输出将是:
Exception: Uncaught exception occurred!
PHP 错误和日志常量
下面的常量始终是作为 PHP 核心的一部分提供。
值 | 常量 | 类型 | 描述 |
---|---|---|---|
1 | E_ERROR | Integer | 致命的运行时错误。这些表示无法恢复的错误,例如内存分配问题。脚本的执行已停止。 |
2 | E_WARNING | Integer | 运行时警告(非致命错误)。脚本的执行不会停止。 |
4 | E_PARSE | Integer | 编译时解析错误。解析错误只能由解析器生成。 |
8 | E_NOTICE | Integer | Run-时间通知。指示脚本遇到了可能指示错误的情况,但也可能在运行脚本的正常过程中发生。 |
16 | E_CORE_ERROR | Integer | PHP 初始启动期间发生的致命错误。这类似于 E_ERROR,只不过它是由 PHP 核心生成的。 |
32 | E_CORE_WARNING | Integer | PHP 初始启动期间发生的警告(非致命错误)。这类似于 E_WARNING,只不过它是由 PHP 核心生成的。 |
64 | E_COMPILE_ERROR | Integer | 致命的编译时错误。这类似于 E_ERROR,只不过它是由 Zend 脚本引擎生成的。 |
128 | E_COMPILE_WARNING | Integer | 编译时警告(非致命错误)。这类似于 E_WARNING,只不过它是由 Zend 脚本引擎生成的。 |
256 | E_USER_ERROR | Integer | 用户生成的错误消息。这类似于 E_ERROR,只不过它是通过使用 PHP 函数 trigger_error() 在 PHP 代码中生成的。 |
512 | E_USER_WARNING | Integer | 用户生成的警告消息。这类似于 E_WARNING,只不过它是通过使用 PHP 函数 trigger_error() 在 PHP 代码中生成的。 |
1024 | E_USER_NOTICE | Integer | 用户生成的通知消息。这类似于 E_NOTICE,只不过它是通过使用 PHP 函数 trigger_error() 在 PHP 代码中生成的。 |
2048 | E_STRICT | Integer | 启用 PHP 建议对代码进行更改,这将确保代码的最佳互操作性和向前兼容性。 |
4096 | E_RECOVERABLE_ERROR | Integer | 可捕获的致命错误。它表明可能发生了危险错误,但并未使引擎处于不稳定状态。如果错误未被用户定义的句柄(由 set_error_handler() 函数设置)捕获,则应用程序将中止,因为它是 E_ERROR。 |
8192 | E_DEPRECATED | Integer | 运行时通知。启用此选项可接收有关在未来版本中无法运行的代码的警告。 |
16384 | E_USER_DEPRECATED | Integer | 用户生成的警告消息。这类似于 E_DEPRECATED,只不过它是通过使用 PHP 函数 trigger_error() 在 PHP 代码中生成的。 |
32767 | E_ALL | Integer | 所有错误、警告和通知。 |
以上值(数字或符号)为用于构建指定要报告哪些错误的位掩码。按位运算符可用于组合这些值或屏蔽某些类型的错误。
完整的 PHP 错误处理参考
有关所有 PHP 错误处理函数的完整参考,请参阅完整的 PHP 错误处理参考。