PHP异常处理

2021-03-19  本文已影响0人  江河湖海琴瑟琵琶

简单的异常捕获

<?php #应用类
namespace Home\Controller;
class TestController{
    function a(){
        try{
            throw new \Exception('异常');
        }catch (\Exception $exception){
            echo $exception->getMessage(); #异常
        }
    }
}

如果类中有20个方法,每个都try_catch?
可以写个基类,在基类的构造函数里注册一个异常处理函数,其他的类继承这个基类

<?php #基类
namespace Home\Controller;
class MyController{
    public function __construct () {
        //set_exception_handler() 接收一个callable
        set_exception_handler(
            function (\Throwable $exception){
                echo $exception->getMessage();
            }
        );
    }
}

继承基类,所有的异常都会抛出给基类,基类可以做统一处理.

<?php #应用类
namespace Home\Controller;
class TestController extends MyController {
    function a(){
        throw new \Exception('异常aaa');#异常aaa
    }
    function b(){
        throw new \Exception('异常bbb');#异常bbb
    }
    function c(){
        throw new \mysqli_sql_exception('数据库异常'); #数据库异常
    }
    function d(){
        set_time_limit(1);
        while(true){}
    }
    function e(){
        ini_set('memory_limit','10M');
        while (true){
            $data[] = 1;
        }
    }
  
}

注意最后两个方法
function d()报错超时
function e()报错内存溢出
并不能被基类捕获
可以注册一个register_shutdown_function(),该方法在脚本结束时执行.

#index.php 入口文件
register_shutdown_function(
    function (){
        $error = error_get_last();
        if ($error){
            dump($error);
        }
    }
);

要注意的是,这个函数可以出现多次,并按注册先后顺序执行,前边的执行了exit(); 后续的将不会执行.有的框架如tp3.2.3已经注册了此方法,并且他内部执行了exit(); 想让自己的方法执行,应该早于框架注册, 可以放在index.php文件中,这样便能处理超时和内存溢出错误

上一篇 下一篇

猜你喜欢

热点阅读