我们在开发项目中,难免会因为逻辑上的失误而报错,这些报错的展现形式也就是框架封装好的异常处理机制。在项目上线之前,我们还可以根据框架提供的报错信息来锁定错误代码的位置。但是项目上线之后我们是一定要关闭php的错误提示的。这个时候,错误日志以及自定义一些异常处理机制就显得尤为重要。
关于laravel的错误日志相关,大家可以参考laravel 5.5的文档,讲的很清楚,咱们这里主要是学习一下laravel的异常处理机制以及自定义一些异常处理。
关于laravel的错误日志
关于laravel错误异常处理机制官方文档 这部分更多的是异常处理的底层部分,强烈推荐大家看一看。
1、php的异常
先了解php的异常机制,常见的错误报告,try{}catch(){}
的大致用法等,这样对于异常就有个大致的了解。其次是异常和错误是不一样的,大家可以参考这篇文章:https://www.cnblogs.com/zyf-zhaoyafei/p/6928149.html ,这样心里对于php的错误,异常就有个数了。
php手册:http://php.net/manual/zh/language.exceptions.php
我们可以在代码中使用try{}catch(){}
来捕获异常,然后进行处理。但程序中可能会出现大量的异常,此时应该使用laravel提供的去全局异常捕获,对于不需要处理的异常添加到 $dontReport = []。其中report
方法一般是对应的分开记录日志处理,render
方法是对应的异常http
响应处理。
2、laravel 5.5 的全局异常处理文件Handler.php
laravel的全局捕获在:app/Exceptions/Handler.php
这部分大家参考laravel5.5文档:Laravel 的错误和日志记录
3、自定义异常之跳转指定页面
public function render($request, Exception $e)
{
//TODO 这里一条自定义http错误自动跳转到首页
if (getenv('APP_ENV') == 'production' && $e instanceof HttpException) {
Log::error($e);
return Redirect::to('admin/dashboard');
}
return parent::render($request, $e);
}
参考博客:https://blog.csdn.net/junming4/article/details/52398513
4、自定义错误页面等
protected function renderHttpException(HttpException $e)
{
if (view()->exists('errors.'.$e->getStatusCode()))
{
return response()->view('errors.'.$e->getStatusCode(), [], $e->getStatusCode());
}
else
{
return (new SymfonyDisplayer(config('app.debug')))->createResponse($e);
}
}
比如你想自定义 404 错误页面的话,只要创建一个 resources/views/errors/404.blade.php 的视图文件
404内容自定义了
5、我自己用到的部分,当debug关闭的时候,进行一些处理
public function render($request, Exception $e)
{
if ($e instanceof ModelNotFoundException) {
$e = new NotFoundHttpException($e->getMessage(), $e);
}
//根据配置文件 显示500错误页
if(env('APP_DEBUG')){
return parent::render($request, $e);
} else {
$user = $request->user();
if(is_null($user)){
$userInfo = "用户未登陆";
}else{
if($user->type == 3){
$userInfo = "用户ID:".$user->id.",用户Idcard:".$user->idcard;
}else{
$userInfo = "用户ID:".$user->id.",用户Email:".$user->email;
}
}
$userInfo = $userInfo.',IP:'.getClientIP();
if(is_a($e, 'Symfony\Component\HttpKernel\Exception\HttpException')){
$errMessage = '页面错误!'.$userInfo.',错误地址:'.$request->fullUrl().",状态码:".$e->getStatusCode().",参数:".json_encode($request->all()).",异常信息:".get_class($e);
}else{
$errMessage = '页面错误!'.$userInfo.',错误地址:'.$request->fullUrl().",参数:".json_encode($request->all()).",异常信息:".get_class($e);
}
$responseData = [
'status_code'=>500,
'message'=>'捕获到错误',
'data'=>'',
];
return response()->json($responseData);
}
}
代码太多显得有点乱,大致意思就是当debug
开着的时候,是在测试环境,我们直接显示默认的异常页面即可,方便调试。当项目上线之后,就要关闭默认的异常页面,防止泄露项目信息。同时自定义报错信息,然后记录下来。
这里的is_a()
方法和instanceof
方法是一样的,有兴趣的可以百度下,都是判断:某对象是否属于该类 或 该类是此对象的父类(用于确定一个 PHP 变量是否属于某一类 class 的实例)
6、laravel自带的http错误页面
源码部分:是在错误页面下面的Handler.php
中的:renderHttpException
方法,有兴趣的朋友可以研究下。
以上就是博主关于laravel 5.5错误异常处理的理解,网上还有很多好文章,感谢大家的分享,一起加油。
end