16.4 自定义错误处理
PHP拥有内置工具,可以让开发人员捕捉程序错误,然后将它们转到自定义的错误处理器。在自定义的错误处理器中,编程显示更多关于错误的详细信息,还可以将错误信息写入文件或数据库。
PHP有3种最基本的错误类型,为注意、警告和错误(或致命错误)。通常情况下,注意和警告不会终止程序,但是致命错误则会导致程序立即中断。例如调用一个没有定义的函数或引用一个不存在的对象就是一个致命性的错误。在PHP中,关键字E_NOTICE表示注意类型的错误,E_WARNING表示警告类型的错误,E_ERROR表示致命类型的错误。
程序阶段的错误显示由PHP函数error_reporting()进行控制。这一函数针对不同的错误等级设置不同的参数。代码16-6就是使用此函数报告警告和致命错误的程序。
代码16-6 显示警告或错误信息16-6.php
01 <?php 02 error_reporting(E_WARNING | E_ERROR); // 显示警告和错误信息 03 echo $uvar; // 这里产生注意信息,但不会显示出来 04 callFunc(); // 这里产生一个致命错误,并且会显示出来 05 ?>
【代码解析】代码第03行试图输出一个未定义的变量$uvar的值,这会产生一个注意级别的错误,但因为在第01行中通过函数error_reporting()设定了显示出错误级别的类型为E_WARNING和E_ERROR,所以第03行的注意信息不会显示到浏览器中。但代码第04行调用一个为未定义的函数callFunc(),这会产生一个致命错误,因此这行代码会在浏览器中显示一个致命错误级别的信息。
很明显,隐藏错误报告并不是一个好主意,自定义错误处理器就是一个很好的、能取代PHP默认错误处理系统的解决方法。自定义错误处理器可以以任何方式设置处理错误信息,包括信息如何显示等。PHP函数中,完成这一功能的是set_error_handler()函数。错误发生时,此函数被自动调用,然后给出4个参数错误代码、错误消息、发生错误的脚本名称和错误出现的行,此函数对错误管理负责。
先看一个简单的例子,见代码16-7。
代码16-7 自定义错误处理函数16-7.php
01 <?php 02 set_error_handler('myHandler'); // 自定义错误处理函数 03 04 function myHandler($code, $msg, $file, $line) 05 { 06 echo "<br/>"; 07 echo " 程序 <b>$file</b> 执行过程中,在第 <b>$line</b> 行,产生一个错误。"; 08 echo "<br/>"; 09 echo " 错误代码为:<b>$code</b>, 错误的原因是: <b>$msg</b>"; 10 } 11 12 echo $uvar; 13 ?>
这段代码的执行结果如图16-7所示。
图16-7 错误自定义处理函数的显示结果
【代码解析】代码中,PHP的默认错误处理器被自定义的错误处理函数myHandler()所取代,当程序执行到第12行时,变量$uvar被激活,PHP通知未定义变量的信息,此信息在运行时引擎产生,然后传递给myHandler()函数,同时错误发生的地址也传递给此函数。然后myHandler()函数输出友好信息来解释错误原因。
注意 错误和致命错误很重要,它们会绕过自定义错误处理函数,然后以PHP默认的错误处理机制进行显示。显示这些信息可使用前面讨论的函数error_reporting()进行控制。
共有条评论 网友评论