Laravel 5.1 中的异常处理器和HTTP异常处理 abort()
错误和异常是处理程序开发中不可回避的议题,在本地开发中我们往往希望能捕获程序抛出的异常并将其显示打印出来,以便直观的知道程序在哪里出了问题并予以解决,而在线上环境我们不希望将程序错误或异常显示在浏览器中(出于安全考虑),这个时候我们仍然要捕获异常,只不过不是显示到浏览器中,而是记录到日志中,方便日后排查问题。
Laravel当然支持PHP原生的错误和异常处理,但是在此基础上进行了一些封装处理,从而更方便在不同开发环境切换以及对错误和异常的处理。
1、配置
我们可以在config/app.php
文件中通过debug
配置项来决定是否开启调试模式,其默认配置如下:
'debug' => env('APP_DEBUG', false),
当然真正的配置位于项目根目录下的.env
文件,如果其值为true
,则如果程序抛出异常会在页面中显示错误异常信息。
2、异常处理器
Laravel应用中所有的异常都通过App\Exceptions\Handler
进行处理,下面我们先简单分析下给异常处理器类的属性和方法:
$dontReport属性
protected $dontReport = [
HttpException::class,
ModelNotFoundException::class,
];
$dontReport
属性定义了不会被记录到日志的异常,比如默认HTTP异常和ModelNotFound
异常都不会记录下来,而是直接在浏览器中打印异常信息。
report方法
public function report(Exception $e)
{
return parent::report($e);
}
report
方法会调用父级的report
方法将异常信息记录到日志中(关于日志我们将在下一节讲)。
render方法
public function render($request, Exception $e)
{
if ($e instanceof ModelNotFoundException) {
$e = new NotFoundHttpException($e->getMessage(), $e);
} return parent::render($request, $e);
}
render
方法会将异常信息渲染到HTTP响应中,从而让我们在开发过程中直观地浏览器中查看错误信息以便找到问题所在。
简单测试示例
下面我们来简单测试下ModelNotFoundException
,顾名思义,在使用Eloquent ORM进行查询时对应模型实例在数据库中没有找到会抛出该异常。
我们照例在TestController的index方法中编写测试代码如下:
$user = User::findOrFail(100);
dd($user);
然后在浏览器中访问http://laravel.app:8000/test
,页面会打印出错误信息:
由于ModelNotFoundException
在$dontReport
属性数组中,因而不会记录到日志中(NotFoundHttpException
是HttpException
的子类,所以也不会被记录到日志),接下来我们测试如下代码:
$num = 1/0;
再次访问http://laravel.app:8000/test
,同样,页面会打印错误信息:
除此之外,在错误日志storage/logs/laravel.log
中也能看到写入进来的错误信息:
[2015-11-08 21:21:47] local.ERROR: exception 'ErrorException' with message 'Division by zero' in /vagrant/laravelapp/app/Http/Controllers/TestController.php:389
Stack trace:
...
而且,通过这些错误信息,既可以知道出错原因,也知道出错代码在程序中的位置,可以大大节省我们排查错误原因的时间,提高编程效率。
3、HTTP异常处理
日常开发中,我们经常会遇到404、500之类的HTTP错误码,表示页面未找到或者服务器错误之类的问题,Laravel为我们提供了单独的方法来处理这些错误异常:
abort方法
我们使用abort
方法来简单抛出HTTP错误码异常,如果页面没找到或者数据不存在,我们使用如下方法抛出404异常:
abort(404);
如果是服务器授权认证失败,我们可以通过如下方式抛出403异常,当然,还可以传入错误信息到abort
方法:
abort(403,'对不起,您无权访问该页面!');
对于抛出403异常的页面,默认显示如下:
这样的页面显然不能放到线上环境,那又应该如何为HTTP异常创建自定义视图呢?别担心,Laravel已经为我们做了周全的处理:
错误页面视图
如果要创建诸如404、403、500这样的HTTP异常自定义视图,只需在resources/views/errors
目录创建与错误码对应的页面视图文件即可。比如要定义上述403异常自定义视图,可以创建resources/views/errors/403.blade.php
文件,现在我们简单定义其内容如下:
{{$exception->getMessage()}}
这样再次测试403异常页面,显示如下:
对不起,您无权访问该页面!
没错,就是403.blade.php
文件中的内容,是不是很方便?
注:
abort
方法底层还是抛出相应异常,404错误抛出NotFoundHttpException
,其他HTTP错误抛出HttpException
。
Laravel 5.1 中的异常处理器和HTTP异常处理 abort()的更多相关文章
- Laravel 5.4 中的异常处理器和HTTP异常处理实例教程
错误和异常是处理程序开发中不可回避的议题,在本地开发中我们往往希望能捕获程序抛出的异常并将其显示打印出来,以便直观的知道程序在哪里出了问题并予以解决,而在线上环境我们不希望将程序错误或异常显示在浏览器 ...
- Spring Boot 中全局异常处理器
Spring Boot 中全局异常处理器,就是把错误异常统一处理的方法.等价于Springmvc中的异常处理器. 步骤一:基于前面的springBoot入门小demo修改 步骤二:修改HelloCon ...
- (转)SpringMVC学习(八)——SpringMVC中的异常处理器
http://blog.csdn.net/yerenyuan_pku/article/details/72511891 SpringMVC在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常 ...
- SpringMVC框架笔记02_参数绑定返回值文件上传异常处理器JSON数据交互_拦截器
目录 第1章 高级参数的绑定 1.1 参数的分类 1.2 数组类型的参数的绑定 1.3 集合类型的参数的绑定 第2章 @RequestMapping的用法 2.1 URL路径映射 2.2 请求方法限定 ...
- SpingBoot全局异常处理器被覆盖的解决办法
@controllerAdvice()注解 @ControllerAdvice()注解可以定义一个统一的异常处理类,我们可以定义多个统一异常处理类, 但这里我们需要注意一点,默认的@Controlle ...
- springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。为了区别不同的异常通常根据异常类型自定义异常类,这里我们创建一个自定义系统异常,如果controller、service、dao抛出此类异常说明是系统预期处理的异常信息。
springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑. 1.1 异常处理思路 系统中异常包括两类:预期异常和运行时异常RuntimeEx ...
- springmvc中拦截器与springmvc全局异常处理器的问题
最近在做一个练手的小项目, 系统架构中用了springmvc的全局异常处理器, 做了系统的统一异常处理. 后来加入了springmvc的拦截器, 为了一些需求, 在拦截器中的 preHandle 方法 ...
- SpringBoot项目中的全局异常处理器 Failed to invoke @ExceptionHandler method
文件下载代码 @RequestMapping(value = { "/data/docking/picture/{id}/{empi}" }) public JsonApi pic ...
- PHP中Exception异常
异常的基本使用 当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 "catch" 代码块. 如果异常没有被捕获,而且又没用使用 set_exception_hand ...
随机推荐
- Kubernetes学习之路(十四)之服务发现Service
一.Service的概念 运行在Pod中的应用是向客户端提供服务的守护进程,比如,nginx.tomcat.etcd等等,它们都是受控于控制器的资源对象,存在生命周期,我们知道Pod资源对象在自愿或非 ...
- JAVA 调用gc机制强制删除文件
在删除文件前调用System.gc()方法,也就是垃圾回收机制,即可成功删除被JAVA虚拟机占用的文件.
- UWP UserControl 不会自适应大小
在一般的Page里面,我们通过VisualStateManager,可以根据窗体的宽度,来调整一些控件大小. <VisualStateManager.VisualStateGroups> ...
- ORM框架学习之EF
首先推荐一篇很好的EF文章翻译,可以系统的学习一遍. <Entity Framework 6 Recipes>中文翻译系列 EF使用体会 优点: 可以省去Ado.net复杂的管道连接代码. ...
- vi/vim 常用命令 之 一图定天下!
直接上干活,一张图解决~
- monkey测试入门1
Monkey是一款通过命令行来对我们APP进行测试的工具,可以运行在模拟器里或真机上.它向系统发送伪随机的用户事件流,实现对正应用程序进行压力测试. 官方介绍 :https://developer.a ...
- Mybatis批量更新报错com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException
批量更新数据,非常简单的一段代码,硬是报错,插入的数据也能显示出来 List<User> userlist = new ArrayList<User>(); userlist. ...
- [Processing]在画布上写文本
准备工作 这一步只是我强迫症犯了哈,这个随意,画几根线而已.每一小格10个像素,中格50,大格100像素 void setup() { size(,); } void draw() { backgro ...
- alibaba/Sentinel 分布式 系统流量防卫兵
Sentinel: 分布式系统的流量防卫兵 Sentinel 是什么? 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多 ...
- NO--14 微信小程序,左右联动二
上一篇讲解了左=>右联动,那个还比较简单,本篇写剩下比较核心的部分,也是本次开发过程中遇到最难的部分,右=>左联动,先简单看一下演示 右左联动.gif 一.关键技术: (1) 小程序 ...