Laravel 5.4 中的异常处理器和HTTP异常处理实例教程
错误和异常是处理程序开发中不可回避的议题,在本地开发中我们往往希望能捕获程序抛出的异常并将其显示打印出来,以便直观的知道程序在哪里出了问题并予以解决,而在线上环境我们不希望将程序错误或异常显示在浏览器中(出于安全考虑),这个时候我们仍然要捕获异常,只不过不是显示到浏览器中,而是记录到日志中,方便日后排查问题。
百牛信息技术bainiu.ltd整理发布于博客园
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.4 中的异常处理器和HTTP异常处理实例教程的更多相关文章
- Laravel 5.1 中的异常处理器和HTTP异常处理 abort()
原文 http://laravelacademy.org/post/1867.html 错误和异常是处理程序开发中不可回避的议题,在本地开发中我们往往希望能捕获程序抛出的异常并将其显示打印出来,以便 ...
- Spring Boot 中全局异常处理器
Spring Boot 中全局异常处理器,就是把错误异常统一处理的方法.等价于Springmvc中的异常处理器. 步骤一:基于前面的springBoot入门小demo修改 步骤二:修改HelloCon ...
- Web 开发中应用 HTML5 技术的10个实例教程
HTML5 作为下一代网站开发技术,无论你是一个 Web 开发人员或者想探索新的平台的游戏开发者,都值得去研究.借助尖端功能,技术和 API,HTML5 允许你创建响应性.创新性.互动性以及令人惊叹的 ...
- (转)SpringMVC学习(八)——SpringMVC中的异常处理器
http://blog.csdn.net/yerenyuan_pku/article/details/72511891 SpringMVC在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常 ...
- Laravel 5.1中 Redis 的安装配置及基本使用教程
关于Redis的介绍我们在之前Laravel 缓存配置一节中已有提及,Redis是一个开源的.基于内存的数据结构存储器,可以被用作数据库.缓存和消息代理.相较Memcached而言,支持更加丰富的数据 ...
- SpringMVC框架笔记02_参数绑定返回值文件上传异常处理器JSON数据交互_拦截器
目录 第1章 高级参数的绑定 1.1 参数的分类 1.2 数组类型的参数的绑定 1.3 集合类型的参数的绑定 第2章 @RequestMapping的用法 2.1 URL路径映射 2.2 请求方法限定 ...
- 0040 Java学习笔记-多线程-线程run()方法中的异常
run()与异常 不管是Threade还是Runnable的run()方法都没有定义抛出异常,也就是说一条线程内部发生的checked异常,必须也只能在内部用try-catch处理掉,不能往外抛,因为 ...
- SpingBoot全局异常处理器被覆盖的解决办法
@controllerAdvice()注解 @ControllerAdvice()注解可以定义一个统一的异常处理类,我们可以定义多个统一异常处理类, 但这里我们需要注意一点,默认的@Controlle ...
- springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。为了区别不同的异常通常根据异常类型自定义异常类,这里我们创建一个自定义系统异常,如果controller、service、dao抛出此类异常说明是系统预期处理的异常信息。
springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑. 1.1 异常处理思路 系统中异常包括两类:预期异常和运行时异常RuntimeEx ...
随机推荐
- 【Java TCP/IP Socket】TCP Socket(含代码)
TCP的Java支持 协议相当于相互通信的程序间达成的一种约定,它规定了分组报文的结构.交换方式.包含的意义以及怎样对报文所包含的信息进行解析,TCP/IP协议族有IP协议.TCP协议和UDP协议.现 ...
- decorate all function in all module
需求: 有package db_api,其下有很多 module 如 plane.py ship.py ufo.py.这些module内定义了方法如 plane.fly(), ship.float() ...
- JS实现根据密码长度 显示安全条
原文:http://www.open-open.com/code/view/1431324883763 //根据密码长度显示安全条 <ul class="clear"> ...
- Java计算文件MD5值代码
原文:http://www.open-open.com/code/view/1424930488031 import java.io.File; import java.io.FileInputStr ...
- HDU 3118 Arbiter 判定奇圈
题目来源:pid=3118">HDU 3118 Arbiter 题意:翻译过来就是不能有奇圈 每走一步状态会变化 当他回到起点时假设和原来的状态不一样 可能会死 求至少去掉多少条边能够 ...
- Yii 清理缓存
html: <button onclick="clearCache()">ClearCache</button> js: function clearCac ...
- 令人赞叹的 MySQL
原文链接 译文链接 感谢 艾凌风 小伙伴校稿 令人赞叹的 MySQL 一个很棒的 MySQL 软件.库以及资源列表. 这个列表接受并鼓舞 pull requests,请看 CONTRIBUTING 文 ...
- Win8下怎样安装Win7 or Win7下怎样安装win8?
预计非常多人可能会用U盘安装工具去去做双系统的安装(Win8下安装Win7, Win7下安装Win8).可是在安装过程中你 会发现一个问题:win7下安装win8,提示你mbr硬盘格式不能安装win8 ...
- Yarn调度器负载模拟器——Yarn Scheduler Load Simulator (SLS)
一.概述: Yarn调度器有很多实现,如Fifo, Capacity和Fair schedulers等.与其同一时候,正在进行一些优化措施来提高调度器在不同负载和工作场景下的性能.每一个调度器都有自己 ...
- java验证码图片
package com.su.servlet; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; impor ...