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