PHP异常和错误

PHP对于异常的支持还不完善,很多异常不会自动抛出需要人为的抛出,这时我们就需要自己通过一些特殊的方法,模拟自动抛出异常

下面的代码你可以捕获大部分的错误

注意我没有使用set_exception_handler:设置用户自定义的异常处理函数

set_exception_handler(callable   $exception_handler)

设置默认的异常处理程序,用于没有用 try/catch 块来捕获的异常。  在exception_handler调用后异常会中止。

11005865-d0dd0bff4dd7ce52.png

 

public function init(){
        
        // 关闭所有PHP错误报告        
        error_reporting(0);
        
        //设置用户自定义的错误处理函数        
        set_error_handler([$this,'errorHandler']);
        
        //注册一个会在php中止时执行的函数       
        register_shutdown_function(function(){
            
            //获取最后发生的错误, 如果还没有错误则返回 NULL
            
            $e = error_get_last();           
            if ($e!=null){              
                $this->errorReport($e);                
                //响应客户端                
                echo Api_Response::response(['status'=>Status::S_SYSTEM_ERROR] ); 
                return false;                
            }
            
        });
            
    }
    
    protected function errorHandler($errno,$errstr,$errfile,$errline){
        
        $data = [ 'errno'=>$errno, 'errstr'=>$errstr, 'errfile'=>$errfile, 'errline'=>$errline, ]; $this->errorReport($data);
        
        //抛出异常
        
        throw new Exception_BaseException(Status::S_SYSTEM_ERROR); }
        
        /** * 记录异常
        
        * @param unknown $data
        
        */
        
        private function errorReport($data){
            
            //开发环境则直接展示出错误信息,便于调试
            
            if ( Yaf_Application::app()->getConfig()->debugFlag ){
                
                var_dump($data);
                
            }
            
            Slog::log($data,SLOG_EMERGENCY);
            
        }
 

注意事项

1.对于Exception的捕获顺序需要注意,如果Exception放在最前面则继承他的新异常都会被它捕获.

所以我们应该将Exception放在最后.让他捕获我们没有捕获的异常

11005865-40acbbf8d345fc4c.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值