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 ...
随机推荐
- 2597: [Wc2007]剪刀石头布
2597: [Wc2007]剪刀石头布 链接 分析: 费用流. 首先转化一下问题,整张图最优的情况是存在$C_n^3$个,即任意3个都行,然后考虑去掉最少不满足的三元环. 如果u赢了v,u向v连一条边 ...
- TMS320VC5509总线驱动LED灯
1. 重新建立的工程,需要添加宏定义才行 CHIP_5509 2. 驱动LED用的是74LVC573锁存器,LE高电平时,Q1=D0,LE低电平时,Q1=之前的状态,下面是数据总线 看下地址总线 看下 ...
- 洛咕 P2465 [SDOI2008]山贼集团
裸的状压dp. 设f[i][j]表示在i字数内放j集合的分部,直接sb转移. // luogu-judger-enable-o2 #include<bits/stdc++.h> #defi ...
- [VB.NET][C#]WAV格式文件头部解析
简介 WAV 为微软开发的一种声音文件格式,它符合 RIFF(Resource Interchange File Format)文件规范,用于保存 Windows 平台的音频信息资源. 第一节 文件头 ...
- 通俗理解BFS和DFS,附基本模板
1.BFS(宽度优先搜索):使用队列来保存未被检测的节点,按照宽度优先的顺序被访问和进出队列 打个比方:(1)类似于树的按层次遍历 (2)你的眼镜掉在了地上,你趴在地上,你总是先摸离你最近的地方,如果 ...
- Python之pexpect详解
一.引子 Pexpect程序主要用于人机对话的模拟,就是那种系统提问,人来回答yes/no,或者账号登陆输入用户名和密码等等的情况.因为这种情况特别多而且繁琐,所以很多语言都有各种自己的实现.最初的第 ...
- Hbase基本用法
hbase 一些重要的解释(杂) 访问habse三种方式 访问hbase table中的行,只有三种方式: 1 通过单个row key访问 2 通过row key的range 3 全表扫描 Row k ...
- elasticsearch(全文检索)的介绍和安装
ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apach ...
- Mysql启动失败解决方案 - 个人经验可能不适合所有场景
以前一直用的Mysql5.5,安装程序是一个exe程序,安装完了相应的服务也给我注册好了,然后直接启动连接即可. 最近升级到了8.0.15,发现和以前不一样了. 8.0.15下载地址 安装解压之后目录 ...
- WinDbg使用学习
拿到软件崩溃之后产生的crash文件,后缀名为dump 使用winDbg的File-----> Open Crash Dump 打开Crash文件 File---------> Symbo ...