【原创】异常信息捕获的两种方式
一、register_shutdown_function方法的使用
脚本时常死掉,而且并不总是那么好看. 我们可不想给用户显示一个致命错误,又或者一个空白页(在display_errors设为off的情况下) . PHP中有一个叫做 register_shutdown_function 的函数,可以让我们设置一个当执行关闭时可以被调用的另一个函数.也就是说当我们的脚本执行完成或意外死掉导致PHP执行即将关闭时,我们的这个函数将会 被调用.所以,我们可以使用在脚本开始处设置一个变量为0,然后在脚本末尾将之设置为1的方法,让PHP关闭回调函数检查脚本完成与否. 如果我们的变量仍旧是0,我们就知道脚本的最后一行没有执行,因此它肯定在程序执行到某处死掉了.我准备了一个非常基本的例子,可以演示在一个致 命错误需要显示时,你应该怎么给用户一些合适的反馈.你可以通过关闭致命错误的显示(译注:可以设置display_errors和 error_reporting),让例子看起来好看些.
<?php// 关闭错误报告【这样页面中就不会有提示了】error_reporting(0);$clean = 0;// 所有程序执行完之后,触发的方法function shutdown_func(){global $clean;var_dump(‘shut–‘.$clean);$error = error_get_last();if ($error){echo “error”;var_dump(error_get_last());}else{echo ‘OK’;}}// 这个方法只有在所有的PHP程序都执行完之后,才会执行register_shutdown_function(“shutdown_func”);echo ‘before’;$a = 1;$a = new FooClass(); // 将因为致命错误而失败// 因为致命错误,这段程序并没有被执行echo ‘after’;$clean = 1;var_dump(‘shut–‘.$clean);
执行结果为:
before C:\wamp64\www\test\index.php:8:string 'shut--0' (length=7) error C:\wamp64\www\test\index.php:12:array (size=4) 'type' => int 1 'message' => string 'Class 'FooClass' not found' (length=26) 'file' => string 'C:\wamp64\www\test\index.php' (length=28) 'line' => int 23
说明:正如代码中所说明的,当发生致命错误的时候,下面的代码并没有被执行,但是按照所执行的顺序来看,before是优先于shutdown_func这个方法的,这说明,register_shutdown_function这个方法是在脚本完全执行完之后才会执行的。
二、try、catch抛出并捕获异常
<?phpecho ‘1<br>’;try {echo ‘2<br>’;if (file_exists(‘test_try_catch.php’)) {require (‘test_try_catch.php’);} else {// 需要将异常抛出,才能在catch中进行捕获throw new Exception(‘file is not exists<br>’);}echo ‘3<br>’;} catch (Exception $e) {echo ‘4<br>’;echo $e->getMessage();}echo ‘5<br>’;
执行结果为:
1 2 4 file is not exists 5
说明:抛出异常之后,被抛出之后的代码将不会被执行,也只有被抛出之后,异常信息才能被捕获到!如果将抛出异常那一步给注释掉,执行的结果为1、2、3、5,即异常信息并没有被捕获!