PHP异常处理类Exception(2)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/m0_37978143/article/details/102696426

上篇说到,PHP不能很好的识别一些错误,报出程序的异常,但是我们可以依赖一些函数来帮助我们搞定这件事,下面就说一下,怎么去把错误处理函数封装到Exception类里面。

想要捕获所有的错误和异常,主要依靠三个函数:register_shutdown_function,set_error_handler,set_exception_handler;

1:set_error_handler()

定义和用法

这个函数作用是,可以用你自己定义的方法来处理运行中的错误。

语法

set_error_handler ( callable $errror_handler [, int $error_types = E_ALL | E_STRICT ] ) : mixed

参数

参数       描述
error_handler 必须。规定发生错误时运行的函数
error_types 可选。规定在哪个错误报告级别会显示用户定义的错误。默认是 "E_ALL"。

下面用代码举个使用的例子:

set_error_handler('handle');
function handle($type, $message, $file, $line)
{
    throw new Exception($message . '错误当做异常');
}

$num = 0;
try {
    echo 1 / $num;
} catch (Exception $e) {
    echo $e->getMessage();
}

试一下,会打印出:“Division by zero错误当做异常”
流程:本来是除0是程序错误(warning级别的错误),且这个错误无法被Exception异常类所捕捉。但是我们可以通过使用set_error_handler()函数,在程序出现错误时,把这个错误通过handle方法调用,抛给异常类,这样错误信息就能以异常的形式抛出来,由此实现错误以异常的形式抛出。不过要注意:set_error_handler()函数捕获级别有限制,只能捕获一些Warning、Notice级别的错误,不能捕获系统级ERROR(致命错误)、PARSE(编译错误)等级别的错误

2:register_shutdown_function()

定义和用法

这个函数是来注册一个会在PHP中止时执行的函数

语法

register_shutdown_function ( callable $errror_handler [, mixed $parameter [, mixed $... ]] )

此函数会在脚本执行完成或者 exit() 或者脚本出现错误后被调用。

callback:回调函数

parameter:可以通过传入额外的参数来将参数传给中止函数(int,string,array,甚至object,都可以传)


该函数能捕获PHP的错误:Fatal Error、Parse Error等,怎么捕捉到呢?这个方法其实是PHP脚本执行结束前最后一个调用的函数,不管脚本错误、die()、exit()、异常、错误、正常结束,都会调用(前提是要把register_shutdown_function函数写在程序结束的前面,写在exit后面可是不会执行的到哦),有了这个函数,就可以在脚本结束前,通过植入获取程序错误的函数error_get_last()来获取程序问题;这个函数可以拿到本次执行结束前产生的最后一个错误。此处是重点,只能获取“一个错误”,而且是“程序结束”之前。比如,如果程序exit;或者出现致命错误之后,再后面的错误就get不到了。

<?php
    error_reporting(0);
    //此回调函数,一定要放在register_shutdown_function函数之前,否则回调不到
    function abc(){
        //此处是最后一步处理,可以记录日志,或者打印出来
        $hah = error_get_last();var_dump($hah);
    }

    register_shutdown_function('abc');
    $num = 0;
    echo 1 / $num;//Warning级别错误
    new haha();//致命错误
    new hehe();//致命错误
?>

上述代码的结果是:INFarray(4) { ["type"]=> int(1) ["message"]=> string(103) "Uncaught Error: Class 'haha' not found in C:\WWW\WWW\Test\Index.php:407 Stack trace: #0 {main} thrown" ["file"]=> string(25) "C:\WWW\WWW\Test\Index.php" ["line"]=> int(407) }
意思就是,1/$num程序正常执行,实例化haha的程序是致命错误,此处终止程序并调用了register_shutdown_function,进行错误的后续处理。由于实例化haha已经成为致命错误,程序不会向下进行,所以实例化hehe的错误没有查到。

通过这种方法,我们就可以巧妙的打印出程序结束前的Fatal Error、Parse Error等错误信息

3:set_exception_handler()

定义和用法

set_exception_handler() 函数设置用户自定义的异常处理函数。

该函数用于创建运行期间的用户自己的异常处理方法。

该函数返回旧的异常处理程序,如果失败则返回 NULL。

语法

set_exception_handler(exception_function)

参数 描述
exception_function 必需。规定未捕获的异常发生时调用的函数。

该函数必须在调用 set_exception_handler() 函数之前定义。这个异常处理函数需要需要一个参数,即抛出的 exception 对象。

简单解释一下,就是设置默认的异常处理程序,并且在回调函数调用后异常会中止。

<?php
function test($exception)
{
    echo "<b>Exception:</b> ", $exception->getMessage();
}

set_exception_handler('test');

throw new Exception('Uncaught Exception occurred');
?>

程序的结果是“Exception:Uncaught Exception occurred”;

PHP的异常绝大部分必须通过某种方法手动抛出,完事才能捕获到,这是一种半自动化的异常处理机制,总之呢,无论是错误还是异常,都可以使用handler系列函数来接管PHP本身的处理机制,整合了上述的方法,异常和错误就可以正常抛出了。

猜你喜欢

转载自blog.csdn.net/m0_37978143/article/details/102696426