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 ...
随机推荐
- 【Menu】 目录索引
一. 开发语言(25%) 1.Python 2.shell 3.C.C++ 4.java 5.html 二.系统(25%) 1.redhat Linux 2.suse Linux 3.windows ...
- hdu1754 I Hate It(线段树单点更新,区间查询)
传送门 有更新单个学生成绩和查询某个区间内学生成绩最大值两种操作 线段树代码 #include<bits/stdc++.h> using namespace std; +; using n ...
- GitLab篇之备份还原
1. GitLab备份配置 输入以下命令,打开gitlab配置文件 [root@code-server ~]# vim /etc/gitlab/gitlab.rb 修改以下配置,gitlab有自动清理 ...
- 保留mysql数据库中的最新1000条记录
<?php mysql_connect("localhost","root","root");mysql_select_db(&quo ...
- springboot+elasticsearch实现全局检索
ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apach ...
- keyup在移动端失效解决方法
keyup在移动端失效解决方法: $("#OBJ").on("input propertychange", function(){ }); 采用 input 与 ...
- centos7 上安装mysql5.7后登录报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: Yes 或者No)
原文转载自以下链接:https://blog.csdn.net/keepd/article/details/77151006 安装完mysql后会有个临时密码去日志查看,但是查看登录修改密后还是不行 ...
- 软件RAID
软件RAID也必须在多磁盘系统中才能实现.实现RAID1最少要拥有两块硬盘,而实现RAID5则最少要拥有三块硬盘.通常情况下,操作系统所在磁盘采用RAID1,而数据所在磁盘采用RAID5. 卷的类 ...
- linux安装nginx并配置负载均衡
linux上安装nginx比较简单: 前提是需要有gcc或者g++ 1.yum需要的依赖 yum -y install openssl openssl-devel 2.解压pcre库.zlib库 ...
- 字幕字体滚动插件——scroxt.js
README scroxt.js Overview scroxt.js是一个字体滚动的插件库,包括视频弹幕滚动,直播弹幕.直播弹幕强制模式.单行水平左右滚动.文本垂直滚动上下,用于简单快捷生成滚动字体 ...