laravel5.8(三)错误,异常处理
一:位置:
laravel的错误处理都是在 app\Exceptions\Handler.php文件中,默认有两个方法
//记录异常log public function report(Exception $exception) //异常日志默认添加到storage\logs //异常记录展示,可以是页面或者json等任意格式,默认是转到一个页面 public function render($request, Exception $exception)
二:瞎搞一下
用json提示异常,我们在做api的时候,总不能用网页报这些错误吧?所以改成json干一干
1:根据异常http code设置
打开这个文件,可以看到在文件的开头use导入了命名空间
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;根据这个命名空间找这个文件:vendor\laravel\framework\src\Illuminate\Foundation\Exceptions\Handler.php,OK,app\Exceptions\Handler.php就是继承的该文件,该文件就是父类,我们打开这个父类,这里面有一个方法:
/** * Create a Symfony response for the given exception. * * @param \Exception $e * @return \Symfony\Component\HttpFoundation\Response */ protected function convertExceptionToResponse(Exception $e) { return SymfonyResponse::create( $this->renderExceptionContent($e), $this->isHttpException($e) ? $e->getStatusCode() : 500, $this->isHttpException($e) ? $e->getHeaders() : [] ); }这个方法可以获取到http信息,比如http code。更多信息参考:vendor\symfony\http-foundation\Response.php
现在回到app\Exceptions\Handler.php中,修改:
/** * 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) { // 获取异常Symfony响应 $error = $this->convertExceptionToResponse($exception); // 判断是否有异常http code if(!empty($error->getStatusCode())){ return response( [ //输出http code异常代码,比如 404,500等等 'status_code' => $error->getStatusCode(), 'message' => $this->errorCode($error->getStatusCode()), ], $error->getStatusCode() //设置真实响应http code,做API的时候也可以不设置 ); } return parent::render($request, $exception); } //自定义http响应msg private function errorCode(int $code) { switch ($code) { case '404': $msg = '请求资源不存在'; break; case '500': $msg = '系统异常, 请稍后再试'; break; default: $msg = '系统异常, 请稍后再试'; break; } return $msg; }效果:{"status_code":500,"message":"系统异常, 请稍后再试"}
2:根据返回对象的类名
/** * 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) { switch (get_class($exception)) { case 'ReflectionException': return response([ 'status_code' => 500, 'message' => '系统异常, 请稍后再试', ],500); break; //vendor\symfony\http-kernel\Exception,这一串太长 可以use 写在头部 case \Symfony\Component\HttpKernel\Exception\NotFoundHttpException::class: return response([ 'status_code' => $exception->getStatusCode(), // 404 'message' => '请求资源不存在', ],$exception->getStatusCode()); break; default: # 其他的,比如token过期,没有权限都可以接在后面 break; } return parent::render($request, $exception); }