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);
}