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 行出错
结束脚本
gradle是个什么物品 Studio中的Gradle相当于eclipse ADT中的adb吗 Android疑问 Android (gradle和maven的区别 哪个主流)
Unable 报错error to vcvarsall.bat exited error Setup script 装置scrapy find with (unable to connect)
C语言中floor函数的使用方法及示例:实现小数向下取整功能详解
Python函数详解:从内建函数到自定义函数的定义、调用与参数传递技巧
Studio中的Gradle相当于eclipse Android疑问 gradle是个什么物品 Android ADT中的adb吗 (studio翻译成中文)