小白巷分享 -- Laravel5的新特性之异常处理

一般在web开发中,我们很少会接触到除了404页面其它的http通信错误页面,即使是做404页面,我们也只是单纯的修改框架自带了404模板,很少能够做到完全的控制。但Laravel5改变了这种现状,那么,我们去看看如何使用Laravel5自定义错误页面的。

Laravel5是如何处理异常的

Laravel5将所有的自定义错误和异常处理都移到了App/Exceptions/Hander.php。早期Laravel的报错页面会显示‘Whoops...‘,然后显示出错误信息,laravel后期还专门弄了个花哨的错误异常页面,可能是觉得异常页面多数在项目上线之后会被关闭或者自定义错误页面,所以就回到了最初的美好---‘Whoops...‘.

在hander里面调用的方法如下:

/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
     * @param  \Exception  $e
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $e)
{
if ($this->isHttpException($e))
{
return $this->renderHttpException($e);
}
else
{
return (new SymfonyDisplayer(config(‘app.debug‘)))->createResponse($e);
}
}

  

所有的HTTP异常(如404和503),它们都是使用renderHttpException方法,它在\Illuminate\Foundation\Exceptions\Handler下可以找见。

/**
* Render the given HttpException.
*
* @param \Symfony\Component\HttpKernel\Exception\HttpException $e
     * @return \Symfony\Component\HttpFoundation\Response
     */
    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);
}
}

  

我们看到view方法下定义了视图存在的位置,{‘errors‘.$e->getStatusCode()},OK,现在就明白了,Http错误页面就是对应在views/errors/[code].blade.php文件,比如:404.blade.php,503.blade.php等等。若是对应的code错误页面不存在,会使用默认的Whoop抛出异常。

我在laravel4中是如何处理异常的

异常捕捉是在路由文件中进行的:

// error
App::error(function (Exception $exception) {
        Log::error($exception);
        $error = $exception->getMessage();

if(Request::ajax()){
return Response::json([‘status‘=>false, ‘error‘=>$error]);
}else{
return Redirect::back()->withErrors(compact(‘error‘));
}
});

  

自定义404错误页面也是在理由文件中进行的:

// 404 page not found
App::missing(function () {
return Response::view(‘errors.404‘, array(), 404);
});

  

相比laravel4,laravel5将http处理独立出来无疑不体现系统架构的合理化。
在之前我们看到Laravel5的异常处理app/exceptions/Hander.php:

class Handler extends ExceptionHandler {

/**
* A list of the exception types that should not be reported.
*
* @var array
*/
protected $dontReport = [
‘Symfony\Component\HttpKernel\Exception\HttpException‘
];

/**
* Report or log an exception.
*
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
*
* @param \Exception $e
         * @return void
         */
        public function report(Exception $e)
{
return parent::report($e);
}

/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
         * @param  \Exception  $e
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $e)
{
return parent::render($request, $e);
}

}

  

第一个方法提交日志,你可以把它提交到你们专门的日志服务器,比如我们公司有自己的鹰眼日志系统;第二个方法执行异常,你也可以在这里使用$e->getStatusCode()获取到http错误代码,根据不同的错误代码进行操作,也可以在此自定义错误模板。

其实,如果大家仔细发现。我在laravel4中对异常处理也是三个方面:日志记录、异常代码处理和自定义错误页面。Laravel5将一系列操作独立出来,那么在异常处理这一块肯定是非常好的提升了。

本文转自小白巷,更多文章,请查看 http://www.xbhub.com

时间: 2024-10-26 10:31:42

小白巷分享 -- Laravel5的新特性之异常处理的相关文章

小白巷之Laravel5的新特性 - Events & Handlers

## Laravel5新特性 - Events & Handlers 事件是系统开发中非常重要的一部分,可以在一次编码后只需修改事件规则,无需更改流程代码.比如商城站,用户在登陆之后,系统会做两件事情: 1. 给新用户发送站内信,欢迎新用户: 2. 发送欢迎邮件: 如果按照原始的程序,会在注册完成之后触发一系列动作函数.但如果后期站内除了折扣码,我们不得不修改核心流程,添加折扣码处理函数.每添加一个动作必须修改核心流程,显然不符合最佳代码规范,我们可以将用户注册完成之后触发的一系列动作封装起来,

Laravel5的新特性 - 目录结构和命名空间

Laravel5的新特性 - 目录结构和命名空间 从Laravel4.2升级到Laravel5最大的一个原因就是因为目录结构的调整.Laravel5的目录结构能够更好的帮助人们理解web开发的最佳实践,对WEB的规范化将会做出不小的贡献.那么,Laravel5的目录结构是什么样的呢? app Commands Console Events Handlers Commands Events Http Controllers Middleware Requests Providers Service

Laravel5.5新特性

1.新的报错页面 报错更加美观,并标记显示出错误的代码 2.包的自动配置 在conposer.json文件中加入包中的配置,下载后就会自动配置到app.php 文件中,使用更方便 在之前的 Laravel 版本当中,我们在安装和使用其他的 Laravel Package 的时候,通常会要在 app.php 中配置对应的 ServiceProvider 和 Facade ,而在 Laravel 5.5 的时候引入的 Package Auto Discovery 就解决了这个问题,这样来说,我们安装

《MySQL 5.7 Replication新特性》分享之互动问题解答

原创 2016-07-21 宋利兵 MySQL中文网 分享主题 <MySQL 5.7 Replication新特性> 嘉宾介绍 宋利兵,MySQL研发工程师.2009年加入MySQL全球研发团队,从事MySQL复制相关功能的开发. 主题介绍 主要分享在MySQL 5.7中,Replication(复制)相关的一些新特性,比如多源复制.增强半同步复制.并行复制等. Agenda GTID复制 多线程并发复制 半同步复制 多源复制 其他特性 这次的PPT.录音我也同时放到百度云盘里了,欢迎下载转存

iOS8新特性扩展(Extension)应用之二——分享插件

iOS8新特性扩展(Extension)应用之二--分享插件 在上一篇博客中,介绍了iOS8新特性扩展功能之一的Today功能:http://my.oschina.net/u/2340880/blog/485533,这里我们再介绍一下分享的扩展功能. 在iOS8之前,除了一些主流的社交平台,例如苹果支持内容分享外,其他开发者的应用若要加入分享的功能,将会十分的复杂.在iOS8的新特性中,apple为我们准备了这样的扩展功能. 首先创建工程,在我们的工程中新建一个Target: 之后,模板中会为我

Java8新特性分享

原文地址:http://www.importnew.com/19345.html |放在下面防止网站挂了..做个备份 1.简介 毫无疑问,Java 8是自Java  5(2004年)发布以来Java语言最大的一次版本升级,Java 8带来了很多的新特性,比如编译器.类库.开发工具和JVM(Java虚拟机).在这篇教程中我们将会学习这些新特性,并通过真实例子演示说明它们适用的场景. 本教程由下面几部分组成,它们分别涉及到Java平台某一特定方面的内容: 语言 编译器 类库 开发工具 运行时(Jav

Spring Cloud Greenwich 新特性和F升级分享

2019.01.23 期待已久的Spring Cloud Greenwich 发布了release版本,作为我们团队也第一时间把RC版本替换为release,以下为总结,希望对你使用Spring Cloud Greenwich 有所帮助 Greenwich 只支持 Spring Boot 2.1.x 分支.如果使用 2.0.x 请使用Finchley版本, pom坐标 主要是适配JAVA11 <!--支持Spring Boot 2.1.X--> <dependency> <g

好程序员分享java8新特性之Lambda表达式

?.Lambda表达式简介 什么是Lambda? Lambda表达式是Java 8推出的?个新特性.从本质上讲,Lambda表达式是?个匿名函数. 为什么要使?Lambda? 使?Lambda表达式可以对?个接?进??常简洁的实现. 之前我们在给?个接?引?赋值的时候,可以使?接?实现类,或者匿名内部类.但是有了 Lambda表达式,我们可以更加?便的实现这个需求. interface Comparator<T>?{ int compare(T o1, T o2); } class Progr

[转]Swift 3 新特性

文/mango_To(简书作者)原文链接:http://www.jianshu.com/p/dc80e290806f 前言 Swift 3今年晚些时候会与大家见面,它会带给Swift开发者巨大的代码层面的改变.如果你最近没有跟进Swift Evolution的步伐,你也许会问到底有啥变化,它会怎样影响你的代码,以及你什么时候应该迁移到Swift 3上来.那么这篇文章会为你一一解答.在这篇文章中,我会着重强调Swift 3中最重要的变化,因为这些会影响你的代码.我们一起来深掘吧! 开始 现在Swi