在代码编写中通常需要捕获各种类型的错误。传统的try catch需要每次进行捕获,比较麻烦。那么我们如何设置一个全局的捕获来统一获取错误呢?
Laravel 中的所有异常都由类App\Exceptions\Handler集中处理,这个类有两个方法:report 和 render。
【report 方法】
report 方法用于记录异常并将其发送给外部服务。默认情况下,report 方法只是将异常传递给异常基类并写入日志进行记录,我们可以在 report 中自定义异常日志记录行为。
【dontReport 属性】
异常处理器的 $dontReport 属性用于定义不进行记录的异常类型。默认情况下,HttpException 和 ModelNotFoundException 异常不会被记录,我们可以添加其他需要忽略的异常类型到这个数组。
【render 方法】
render 方法负责将异常转化为 HTTP 响应。默认情况下,异常会传递给 Response 基类生成响应。我们可以 render 方法中进行异常捕获和返回自定义的 HTTP 响应
本次捕获主要通过render方法实现,并且定义了一些错误等级。
具体代码如下:
<?php namespace App\Exceptions; use Exception; use Illuminate\Database\QueryException; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; use Symfony\Component\HttpKernel\Exception\HttpException; class Handler extends ExceptionHandler { protected $levels = [ 100 => 'debug', 200 => 'info', 300 => 'notice', 400 => 'notice', 500 => 'warning', 600 => 'error', 700 => 'critical', 800 => 'alert', 900 => 'emergency', ]; protected $msg = [ 100 => '通信成功', 200 => '请求处理成功', 300 => '身份验证失败', 400 => '参数验证失败', 500 => '请求地址/类型错误', 600 => '数据库语句错误', 700 => '服务端出现异常', 800 => '服务超时请重试', 900 => '程序错误请重试', ]; protected $code = 0; /** * A list of the exception types that are not reported. * * @var array */ protected $dontReport = [ // ]; /** * A list of the inputs that are never flashed for validation exceptions. * * @var array */ protected $dontFlash = [ 'password', 'password_confirmation', ]; /** * Report or log an exception. * * @param \Exception $exception * @return void */ public function report(Exception $exception) { parent::report($exception); } /** * Render an exception into an HTTP response. * * @param \Illuminate\Http\Request $request * @param \Exception $exception * @return \Illuminate\Http\Response */ public function render($request, Exception $exception) { if ($exception instanceof HttpException) { $this->code = 500; } if ($exception instanceof QueryException) { $this->code = 600; } if ($exception instanceof \ReflectionException) { $this->code = 700; } if ($exception instanceof \RuntimeException) { $this->code = 800; } if ($exception instanceof \ErrorException) { $this->code = 900; } if($this->code){ $result = [ 'request' =>$request->input(), 'data' => $exception->getMessage(), 'code' => $this->code, 'msg' => $this->msg[$this->code], ]; \Illuminate\Support\Facades\Log::log($this->levels[$this->code],'Render Data',$result); unset($result['request']); return response()->json($result, 200); } return parent::render($request, $exception); } }
登录后可发表评论