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

异常和错误

相关文章: