PHP set_error_handler() 函数详解:如何自定义错误处理方法及示例

原来的

PHP set_error_handler() 函数详解:如何自定义错误处理方法及示例

已有 1103 人浏览

set_error_handler() 函数设置用户定义的错误处理函数。该函数用于创建用户自己的运行时错误处理方法。该函数返回旧的错误处理程序,如果失败则返回 null

set_error_handler() 函数设置用户定义的错误处理函数。该函数用于创建用户自己的运行时错误处理方法。该函数返回旧的错误处理程序,如果失败则返回 null。

让我们看一些例子。

设置错误处理程序()

PHP 从 4.1.0 开始就为自定义错误处理处理程序提供了函数 set_error_handler(),但很少有脚本编写者知道它。 set_error_handler函数可以防止错误路径泄露,当然它还有其他功能。

1.可用于阻止错误。如果出现错误,一些信息就会暴露给用户,并且很有可能成为黑客攻击你网站的工具。第二,让用户感觉你的水平很低。

2、可以记录错误信息,及时发现生产环境中的一些问题。

3、可以进行相应的处理。当发生错误时,可以显示跳转到预定义的错误页面,以提供更好的用户体验。

4、可作为调试工具。有时您必须在生产环境中调试某些内容,但又不想影响正在使用它的用户。

5.. 。 。

set_error_handler的用法如下:

代码如下:

view sourceprint?1 string set_error_handler ( callback error_handler [, int error_types])

登录后复制

我们使用 error_reporting() 看到的错误消息;包括三部分,错误信息、错误文件的绝对地址、发生错误的行数。事实上,还有另一种错误。数组( [type] => 1 [message] => 调用未定义方法 SomeClass::somemedthod() [file] => /home/zhangy/www/aaaa/stasdf.php [line] => 67 ),它是最好不要将页面的绝对路径暴露给别人,否则会给一些人抱怨的机会。为了防止这种情况,很多人会使用 ini_set("display_errors",0);直接屏蔽错误信息。这很不方便。如果我们想读取信息怎么办?是不是每次检查都需要改代码,或者改一下apache的配置然后重启?

PHP有函数set_error_handler来解决这个问题

用法如下:

混合 set_error_handler ( 回调 $error_handler [, int $error_types = E_ALL | E_STRICT ] )

php函数register_shutdown_function也可以解决这个问题

用法如下:

int register_shutdown_function ( 字符串 $func )

个人觉得自己定义报错函数至少有三个好处:

1、不会显示文件的绝对路径,更安全。

2. 即使确实出现错误消息,我们也可以对错误消息进行处理,使用户看不到诸如致命错误之类的东西。更好的用户体验

3、项目上线后,有时候你还是要帮助用户解决问题。这个时候修改代码是不可避免的,但是我们也希望错误信息能够被报告出来,并且不让用户看到。这时候使用 set_error_handler 这样的函数就很爽了。

我个人做了一个小测试

My ERROR [$errno] $errstr
n";  echo " Fatal error on line $errline in file $errfile";  echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")
n";  break;  case E_USER_WARNING:  echo "My WARNING [$errno] $errstr
n";  echo " warning on line $errline in file $errfile";  echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")
n";  break;  case E_USER_NOTICE:  echo "My NOTICE [$errno] $errstr
n";  echo " notice on line $errline in file $errfile";  echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")
n";  break;  default:  echo "Unknown error type: [$errno] $errstr
n";  echo " warning on line $errline in file $errfile";  echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")
n";  break;  }  return true;  } class SomeClass {  public function someMethod() {  }  } SomeClass::someMedthod(); $a="asdf";  foreach($a as $d){  echo $d;  }  ?>

登录后复制

现在我们使用自定义错误处理来过滤掉实际路径。假设有一个变量$admin,我们用它来判断访问者是否是管理员(可以通过IP或登录用户ID来判断)

//admin是管理员的身份判定,true是管理员。

//自定义错误处理函数必须有这四个输入变量$errno、$errstr、$errfile、$errline,否则无效。

function my_error_handler($errno,$errstr,$errfile,$errline) 
{ 
  //如果不是管理员就过滤实际路径 
  if(!admin) 
  { 
    $errfile=str_replace(getcwd(),"",$errfile); 
    $errstr=str_replace(getcwd(),"",$errstr); 
  } 
  switch($errno) 
  { 
    case E_ERROR: 
    echo "ERROR: [ID $errno] $errstr (Line: $errline of $errfile) n"; 
    echo "程序已经停止运行,请联系管理员。"; 
    //遇到Error级错误时退出脚本 
    exit; 
    break; 
    case E_WARNING: 
    echo "WARNING: [ID $errno] $errstr (Line: $errline of $errfile) n"; 
    break; 
    default: 
    //不显示Notice级的错误 
    break; 
  } 
}

登录后复制

这样就自定义了一个错误处理函数,那么如何将错误处理交给这个自定义函数呢?

// 应用到类 
set_error_handler(array(&$this,"appError")); 
//示例的做法 
set_error_handler("my_error_handler");

登录后复制

so easy,这样就可以很好的解决安全性和调试方便性之间的矛盾了。您还可以花点心思让错误消息变得更漂亮,以符合网站的风格。

在上面的例子中,我关闭了错误消息并使用我自己的函数来处理错误。上面的页面会报致命错误。我们可以使用errorHandler来控制和处理报告的错误消息。

好了,总结一下,这里是set_error_handler的三个用途:

php代码

class CallbackClass {
 function CallbackFunction() {
 // refers to $this
 }
 
function StaticFunction() {
 // doesn't refer to $this
 }
 }
 
function NonClassFunction($errno, $errstr, $errfile, $errline) {
 }
 // 三种方法如下:
 
 set_error_handler(‘NonClassFunction'); // 直接转到一个普通的函数 NonClassFunction
 set_error_handler(array(‘CallbackClass', ‘StaticFunction')); // 转到 CallbackClass 类下的静方法 StaticFunction
 $o =& new CallbackClass();
 set_error_handler(array($o, ‘CallbackFunction')); // 转到类的构造函数,其实本质上跟下面的第四条一样。
. $o = new CallbackClass();
// The following may also prove useful
class CallbackClass {
 function CallbackClass() {
 set_error_handler(array(&$this, ‘CallbackFunction')); // the & is important
 }
function CallbackFunction() {
 // refers to $this
 }
 }

登录后复制

下面我花点时间单独向大家介绍一下PHP的set_error_handler()函数。

定义和用法

set_error_handler() 函数设置用户定义的错误处理函数。

该函数用于创建用户自己的运行时错误处理方法。

该函数返回旧的错误处理程序,如果失败则返回 null。

语法

set_error_handler(错误函数,错误类型)

参数说明

error_function 是必需的。指定发生错误时要运行的函数。

error_types 是可选的。指定在哪个错误报告级别显示用户定义的错误。默认值为“E_ALL”。

提示和注释

提示:如果使用此函数,则完全绕过标准 PHP 错误处理函数,并且用户定义的错误处理程序必须在必要时终止 (die()) 脚本。

注意:如果在执行脚本之前发生错误,则不会使用自定义错误处理程序,因为当时尚未注册自定义程序。

例子

Custom error: [$errno] $errstr
";  echo " Error on line $errline in $errfile
";  echo "Ending Script";  die();  } //set error handler set_error_handler("customError"); $test=2; //trigger error if ($test>1)  {  trigger_error("A custom error has been triggered");  } ?>

登录后复制

输出:

自定义错误:[1024] 已触发自定义错误

C:/webfolder/test.php 第 19 行出错

结束脚本

你可能想看:
« 上一篇
下一篇 »

相关推荐

php实时推送,php实地培训

2026年10月05日

53阅读

php乱码出现问号的原因,php乱码出现问号的原因有哪些

2026年10月05日

45阅读

php一句话木马,一句话木马ctf

2026年10月05日

48阅读

php获取数组长度,php中如何获取数组的长度

2026年10月05日

50阅读

php面试题库及答案,php程序员面试真题库

2026年10月05日

47阅读

phpcontent-type修改,php源码二次修改需要多少钱

2026年10月05日

42阅读