PHP用set_error_handler()拦截程序中的错误

一个很有用的函数, set_error_handler() 顾名思义,自定义错误的处理。很有用的函数:

  1. 可以用来屏蔽错误。 出现错误一来会把一些信息暴漏给用户,极有可能成为黑客攻击你网站的工具。 二来让用户觉得你的水平很挫。
  2. 可以记下错误的信息, 及时发现一些生产环境的出现的问题。
  3. 可以做相应的处理, 出错的时候可以显示跳转到预先定义好的出错页面,提供更好的用户体验。
  4. 可以作为调试工具, 一些时候必须在生产环境调试一些东西, 但又不想影响正在使用的用户。
  5. 。。。。
    废话不多说, 上代码:
<?php
 //屏蔽程序中的错误
 error_reporting (0);//定义Error_Handler 函数
 /**
 * 定义Error_Handler 函数
 *
 * @param $error_level 错误级别
 * @param $error_message 错误信息
 * @param $file 错误所在文件
 * @param $line 错误所在行数
 *
 */
function error_handler ($error_level, $error_message, $file, $line) {$EXIT = FALSE;

switch ($error_level) {
 //提醒级别
 case E_NOTICE:
 case E_USER_NOTICE:
 $error_type = 'Notice';
 break;

//警告级别
 case E_WARNING:
 case E_USER_WARNING:
 $error_type = 'Warning';
 break;

//错误级别
 case E_ERROR:
 case E_USER_ERROR:
 $error_type = 'Fatal Error';
 $EXIT = TRUE;
 break;

//其他未知错误
 default:
 $error_type = 'Unknown';
 $EXIT = TRUE;
 break;
 }
 //直接打印错误信息, 也可以写文件, 写数据库, 反正错误信息都在这, 任你发落
 printf ("<font color='#ff0000'><b>%s</b></font>: %s in <b>%s</b> on line <b>%d</b><br /><br />n", $error_type, $error_message, $file, $line);

//错误影响到程序的正常执行的话跳转到友好的错误提示页面
 if (TRUE == $EXIT) {
 echo "<script language='Javascript'>location='err.html'; </script>";
 }

}
 //这个才是关键点, 把错误的处理交给 error_handler()
 set_error_handler ('error_handler');

#使用未定义的变量要报 notice 的
 echo $novar;
 #除以0要报警告的
 echo 3/0;
 #自定义一个错误
 trigger_error ('Trigger a fatal error', E_USER_ERROR);

有图有真相, 上执行结果图:

不过有一点, 系统直接报 Fatal Error 的这里抓不到, 因为系统不可能把这么重大的错误交给你处理。 这类的错误也不太多只有寥寥几种情况才会报Fatal Error的, 比如调用了一个未定义的函数。 大多数还是报警告的, require()一个不存在的文件是先报一个警告再报错的。

未经允许不得转载:SuperMan's blog » PHP用set_error_handler()拦截程序中的错误

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址