PHP 错误处理 set_error_handler() 函数


PHP set_error_handler() 函数用于程序错误管理,允许您以自己的方式处理错误,而不是依赖 PHP 的内置错误消息。这可以提高程序的安全性和实用性。

使用 set_error_handler() 告诉 PHP 使用您创建的自定义函数来处理错误,可以通过设置自定义错误处理程序来指定在出现错误时应发生的情况。

如果需要,您甚至可以通过在错误处理程序中使用 exit() 之类的命令来阻止脚本运行。

请务必注意,set_error_handler() 不适用于某些重要错误,例如 E_ERROR E_PARSE。这些错误将由 PHP 内置的错误处理系统处理。

语法

以下是 PHP 错误处理 set_error_handler() 函数的语法 -


callable set_error_handler ( ?callable $handler, int $error_levels = E_ALL );

参数

以下是 set_error_handler() 函数的参数 -

参数 描述
$handler (必需)用于处理错误的用户定义的函数 (callback)。如果传递了 null,它会将错误处理程序重置为 PHP 的默认值。
$error_levels (可选)确定哪些错误级别将导致处理程序,就像 error_reporting 设置一样。默认值为 E_ALL。

以下是 $handler 的语法 -


bool handler(
   int $errno,
   string $errstr,
   string $errfile = ?,
   int $errline = ?,
   array $errcontext = ?
)

以下是上述语法的参数描述 -

参数 描述
errno 第一个参数 errno 包含引发的误差级别(整数)。
errstr 第二个参数 errstr 包含字符串形式的错误消息。
errfile 第三个参数是可选的 errfile,它包含引发错误的文件名(以字符串形式)。
errline 第四个参数是可选的 errline,它包含引发错误的行号(整数)。
errcontext 第五个参数是可选的 errcontext,它是一个数组,指向发生错误时的活动元件表。

返回值

set_error_handler() 函数返回之前定义的错误处理程序(如果有)。如果使用内置错误处理程序,则返回 Null。如果前面的错误处理程序是类方法,则此函数将返回一个包含类和方法名称的索引数组。

PHP 版本

set_error_handler() 函数首次引入 PHP 4.0.1 中,在 PHP 5、PHP 7 和 PHP 8 可继续运行。

示例 1

下面的程序定义了一个名为 errorHandlerFunc 的简单自定义错误处理程序函数。该函数用于显示错误消息,并在访问未定义的变量时生成通知。自定义错误处理程序是使用 PHP 错误处理 set_error_handler() 函数设置的。


<?php
   // 自定义错误处理函数
   function errorHandlerFunc($errno, $errstr) {
      echo "错误: [$errno] $errstr\n";
   }
   
   // 设置自定义错误处理程序
   set_error_handler("errorHandlerFunc");
   
   // 触发错误
   echo $undefined_variable;
?>

以下是以下代码的结果 -

错误: [8] Undefined variable: undefined_variable

示例 2

在此示例中,自定义错误处理程序会检测警告(例如,尝试打开不存在的文件)。errorHandlerFunc 函数在确定问题是否为警告后打印错误消息。处理程序是在 set_error_handler() 函数的帮助下设置的。


<?php
   // 自定义错误处理函数
   function errorHandlerFunc($errno, $errstr) {
      if ($errno == E_WARNING) {
         echo "警告: $errstr\n";
      }
   }
   
   // 设置自定义处理程序
   set_error_handler("errorHandlerFunc");
   
   // 触发警告
   $file = fopen("non_existent_file.txt", "r"); 
?> 

这将生成以下输出 -

警告: fopen(non_existent_file.txt): failed to open stream: No such file or directory

示例 3

在此示例中,自定义错误处理程序  advancedErrorHandler 记录错误消息并处理各种错误类型,例如警报和警告。如果引发致命错误 (E_ERROR),则脚本使用 exit() 结束。处理程序 E_ALL 处理所有错误级别。


<?php
   // 自定义错误处理函数
   function errorHandlerFunc($errno, $errstr, $errfile, $errline) {
      if ($errno == E_WARNING) {
         echo "警告: $errstr<br>";
      } elseif ($errno == E_NOTICE) {
         echo "通知: $errstr<br>";
      } else {
         echo "未知错误类型: $errno<br>";
      }

      // 因出现致命错误而停止脚本执行
      if ($errno == E_ERROR) {
         echo "发生严重错误!正在终止脚本。";
         exit();
      }
   }

   // 设置自定义处理程序
   set_error_handler("errorHandlerFunc", E_ALL);

   // 触发警告
   echo $undefined_variable;  

   // 触发致命错误
   trigger_error("这是一个致命的错误", E_ERROR);
?> 

这将创建以下输出 -

通知: Undefined variable: undefined_variable
警告: Invalid error type specified

示例 4

此代码将演示如何编写自己的 PHP 错误处理程序。定义了一个名为 errorHandlerFunc() 的函数,以特定方式处理问题,例如显示出现问题的文件和行号以及自定义问题消息。此自定义错误处理程序是使用 set_error_handler() 函数设置的。


<?php
   function errorHandlerFunc($errno, $errstr, $errfile, $errline) {
      echo "自定义错误: [$errno] $errstr\n";
      echo "$errfile 中的 $errline 行出错\n";
      echo "结束脚本";
      
      die();
   }

   // 设置错误处理程序
   set_error_handler("errorHandlerFunc");
   $test = 0;

   // 触发错误
   if ($test >  -1) {
      trigger_error("已触发自定义错误");
   }
?> 

以下是上述代码的输出 -

自定义错误: [1024] 已触发自定义错误
C:\user\WWW\index.php 中的 16 行出错
结束脚本