【原创】异常信息捕获的两种方式

【原创】异常信息捕获的两种方式

一、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抛出并捕获异常

<?php
echo ‘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,即异常信息并没有被捕获!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据