PHP的全局错误处理详细解决方案

本文的目的

在开发项目有用的全局错误处理PHP,可以帮助开发人员快速定位问题,提高工作效率。默认情况下,全局误差直接输出,但框架库用在最近的发展建立一个全局的错误处理,导致许多错误信息没有输出,并且具有位置问题的一些费时的。因此,我们研究了该库的实现,并发现它error_reporting和set_error_handler,导致这一现象。现在记录这两个函数的使用作为一个备忘录。

背景

PHP没有类型检测,这是开发商进入错误的单词更容易,导致致命的错误,并最终导致脚本停止执行。如果你不在这个时候得到任何错误的信息,这将是一个非常痛苦的事情。你必须要从脚本的第一行调试,继续打印或在一排排的代码千回声直到找到错误的字。然后,你必须返回原路和删除所有先前添加的打印或回声。这是一个无聊的工作。

概况

在正常情况下,PHP将直接输出致命错误,并输出错误的源(文件地址、行号)和原因,以便可以轻松地定位在开发中。

但有时候,也许因为对php.ini设置问题,也可能是第三方框架的配置问题,导致这些信息的输出。此时,我们必须学会设置相关参数并输出这些错误信息,以帮助快速找到问题所在。

error_reporting

error_reporting是一个PHP的全局配置参数,在php.ini.for配置错误输出水平,参数是一个点,它可以用来设置错误输出水平,以下是在php.ini中从复制的信息:


error_reporting是位域。或每一个数字得到想要的错误
Reporting level
e_all -所有错误和警告(不包括e_strict)
e_error致命的运行时错误
e_recoverable_error几乎致命的运行时错误
e_warning;警告-运行(非致命错误)
e_parse编译时解析错误
e_notice;通知(这些是运行时警告,这往往导致
从代码中的bug,但它可能是
故意(例如,使用未初始化的变量)
依靠事实,它会自动初始化为
空字符串)
e_strict -运行注意事项,使有PHP建议修改
到您的代码中,这将确保最佳互操作性。
以及代码的向前兼容性
e_core_error -致命错误PHP的初始启动过程中发生的
E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's
初始启动
e_compile_error致命的编译时错误
e_compile_warning;警告-编译时(非致命错误)
e_user_error用户生成的错误消息
e_user_warning用户产生的警告信息
e_user_notice用户生成通知消息

实例:

显示除错误以外的所有信息,通知和编码标准警告

error_reporting = e_all ~ e_notice

-显示所有错误,除了通知之外

error_reporting = e_all ~ e_notice e_strict |;

-只显示错误

error_reporting = e_compile_error | e_recoverable_error | e_error | e_core_error

显示所有错误,除了通知和编码标准警告之外

error_reporting = e_all ~ e_notice




默认情况下,PHP输出的错误信息,除了通知。同理,PHP的标准功能提供了相同的功能error_reporting(int $级)为同一功能的PHP脚本。这不会影响其它程序。值得注意的是,当美元的水平是0,这关是错误输出,,任何错误将不会输出。

set_error_handler

默认的错误处理PHP是输出的信息。但是,有时你需要定义其他一些操作,你需要自定义错误处理function.php提供了一个内置的功能,可以帮助我们set_error_handler登记自己的错误处理函数。函数原型如下:

混合set_error_handler(回调error_handler美元美元error_types = e_all { int,e_strict } |)

值得注意的是,即使登记错误处理功能,默认的行为,仍然执行的是错误的,还将输出一个错误信息,所以需要在程序中错误的液位显示设置为0,然后登记错误处理他们自己的功能。这样,在生产环境,尤其重要的是因为眼前的错误,和敏感的内部错误信息将不会受到潜在的恶意用户。它还指出一个自定义错误处理函数不能处理致命错误重要(如编译错误)。以下是自定义错误处理程序的使用:


< PHP
(0)error_reporting;
功能error_handler(error_level美元,error_message美元美元美元,文件,线){
退出= false;
Switch ($error_level) {
案例e_notice:
案例e_user_notice:
error_type美元= 'notice;
打破;
案例e_warning:
案例e_user_warning:
$error_type ='Warning';
打破;
案例e_error:
案例e_user_error:
error_type美元= 'fatal错误;
$出口=真;
打破;
违约:
error_type美元= 'unknown;
$出口=真;
打破;
}
printf(%s %s %s %d 线

如果(退出){
(死亡);
}
}
set_error_handler('error_handler);

/ /无();
echo $该;
回声3 0;
trigger_error('trigger致命错误,e_user_error);
新的无();
>



可以通过执行此脚本获得以下输出:


注意:定义变量:该在的/你的/ php_demo_file.php线40

警告:在以零分的/你的/ php_demo_file.php线41

致命错误:触发致命的错误/你/ php_demo_file.php线42




你可以看到最新的NoExistClass()的例外是不是由一个自定义的错误处理函数捕获。

最后,提及,异常处理set_exception_handler顶部注册,在一个网站,可以设置,然后跳转到统一的错误处理页面。