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,以将此处理程序重置为其默认状态。除了函数名之外,还可以使用包含对象引用和方法名的数组。
handler(errno, errstr, errfile, errline) 

  • errno - 第一个参数 errno 将以整数形式传递引发的错误级别。
  • errstr - 第二个参数 errstr 将以字符串形式传递错误消息。
  • errfile - 如果回调接受第三个参数 errfile,则将以字符串形式传递引发错误的文件名。
  • errline - 如果回调接受第四个参数 errline,则将传递行号,其中错误以整数形式引发。

如果函数返回 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 之前,该处理函数的签名为:

handler(Exception $ex): void 

自 PHP 7 以来,大多数错误都是通过抛出 Error 异常来报告的,该异常也会被处理程序捕获。 Error 和 Exception 都实现了 Throwable 接口。从 PHP 7 开始,该处理函数的签名为:

handler(Throwable $ex): void 
可以传递 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 核心的一部分提供。

常量类型描述
1E_ERRORInteger致命的运行时错误。这些表示无法恢复的错误,例如内存分配问题。脚本的执行已停止。
2E_WARNINGInteger运行时警告(非致命错误)。脚本的执行不会停止。
4E_PARSEInteger编译时解析错误。解析错误只能由解析器生成。
8E_NOTICEIntegerRun-时间通知。指示脚本遇到了可能指示错误的情况,但也可能在运行脚本的正常过程中发生。
16E_CORE_ERRORIntegerPHP 初始启动期间发生的致命错误。这类似于 E_ERROR,只不过它是由 PHP 核心生成的。
32E_CORE_WARNINGIntegerPHP 初始启动期间发生的警告(非致命错误)。这类似于 E_WARNING,只不过它是由 PHP 核心生成的。
64E_COMPILE_ERRORInteger致命的编译时错误。这类似于 E_ERROR,只不过它是由 Zend 脚本引擎生成的。
128E_COMPILE_WARNINGInteger编译时警告(非致命错误)。这类似于 E_WARNING,只不过它是由 Zend 脚本引擎生成的。
256E_USER_ERRORInteger用户生成的错误消息。这类似于 E_ERROR,只不过它是通过使用 PHP 函数 trigger_error() 在 PHP 代码中生成的。
512E_USER_WARNINGInteger用户生成的警告消息。这类似于 E_WARNING,只不过它是通过使用 PHP 函数 trigger_error() 在 PHP 代码中生成的。
1024E_USER_NOTICEInteger用户生成的通知消息。这类似于 E_NOTICE,只不过它是通过使用 PHP 函数 trigger_error() 在 PHP 代码中生成的。
2048E_STRICTInteger启用 PHP 建议对代码进行更改,这将确保代码的最佳互操作性和向前兼容性。
4096E_RECOVERABLE_ERRORInteger可捕获的致命错误。它表明可能发生了危险错误,但并未使引擎处于不稳定状态。如果错误未被用户定义的句柄(由 set_error_handler() 函数设置)捕获,则应用程序将中止,因为它是 E_ERROR。
8192E_DEPRECATEDInteger运行时通知。启用此选项可接收有关在未来版本中无法运行的代码的警告。
16384E_USER_DEPRECATEDInteger用户生成的警告消息。这类似于 E_DEPRECATED,只不过它是通过使用 PHP 函数 trigger_error() 在 PHP 代码中生成的。
32767E_ALLInteger所有错误、警告和通知。

以上值(数字或符号)为用于构建指定要报告哪些错误的位掩码。按位运算符可用于组合这些值或屏蔽某些类型的错误。

完整的 PHP 错误处理参考

有关所有 PHP 错误处理函数的完整参考,请参阅完整的 PHP 错误处理参考。