美文网首页
异常和错误

异常和错误

作者: zhyke | 来源:发表于2018-08-16 18:20 被阅读0次

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

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

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

    set_exception_handler(callable   $exception_handler)

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

    代码截图

    代码.yaf框架,有些自带的函数但是不难替换

    class BaseControl extends Yaf_Controller_Abstract{

    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放在最后.让他捕获我们没有捕获的异常

    相关文章

      网友评论

          本文标题:异常和错误

          本文链接:https://www.haomeiwen.com/subject/xubobftx.html