资讯专栏INFORMATION COLUMN

Laravel 异常处理

shadajin / 2410人阅读

摘要:在通常情况下,会自动将异常信息分为两种格式来处理或者。而在这之前,它会把基本所有的异常信息先处理为后面讲一下常见的异常处理。认证异常处理认证异常是指,这个是由的方法来处理的。

学 Laravel 和 Vuejs,来 codecasts.com 看高质量视频教程

之前的一篇文章介绍了 Laravel 的异常和日志的一些情况,本文来看看 Laravel 在处理异常返回的时候是什么样的流程。

在 Laravel 的项目中,出现异常的时候,Laravel 会默认去寻找这个类中是否存在 render() 这个方法,因为这个方法是负责处理渲染异常信息的。所以你要自定义异常的返回信息的话,可以直接在 render() 方法里面实现,这都是看你自己的需求。

在通常情况下,Laravel 会自动将异常信息分为两种格式来处理:HTML 或者 JSON。而在这之前,它会把基本所有的异常信息先处理为 HTTPException

if ($e instanceof ModelNotFoundException) {
    $e = new NotFoundHttpException($e->getMessage(), $e);
} elseif ($e instanceof AuthorizationException) {
    $e = new HttpException(403, $e->getMessage());
} elseif ($e instanceof TokenMismatchException) {
    $e = new HttpException(419, $e->getMessage());
}

后面讲一下 Laravel 常见的异常处理。

认证异常处理

认证异常是指IlluminateAuthAuthenticationException,这个是由 AppExceptionsunauthenticated() 方法来处理的。默认情况下,laravel 会将用户重定向到 /login URL 中,但是如果你是期望返回 JSON 数据的话,大概返回的信息如下:

{"message" : "Unauthenticated."}
表单验证异常处理

其实在表单验证不通过的时候,如果我们使用的是传统的重定向到某个页面中,我们通常会使用类似下面的代码来提示错误信息:

@if (count($errors) > 0)
    
    @foreach ($errors->all() as $error)
  • {{ $error }}
  • @endforeach
@endif

其实表单验证出错的时候也是可以直接使用 JSON 的格式返回的,这个时候需要注意的是,返回的 HTTP 状态码是 422

{
  "message": "The given data failed to pass validation.",
  "errors": {
    "name": [
        "The name field is required.",
        "The name field must be a string."
    ]
  }
}
其他的异常处理

目前来说,Laravel 也是直接将大多数的异常转化为 HTTPException,但是某些情况下我们还是需要自己去处理异常的返回信息,这个时候怎么办?

使用 expectsJson() !这个方法可以非常easy地实现我们队 JSON 返回的需求!expectsJson() 主要是通过指定一个特定的 X-Requested-With header 来实现的,如果这个 header 携带 XMLHttpRequest 的值的话,Laravel 就认为我们期望返回的是 JSON 格式的异常信息。如果说你使用 Laravel 推荐的 axios 的话,在 assets 下的 bootstrap.js 文件就可以看到,Laravel 官方就会为你指定这个 header:

window.axios.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest";

所以在我们使用expectsJson()返回异常信息的时候,大概的格式是下面这样:

{
    "message": "...",
    "file": "...",
    "line": 0,
    "trace": "..."
}

我们在前端处理的时候通常就是取 message 就好了。

那如果说是正常的 HTML 的返回格式呢?这个时候,其实你就可以在 resources/views/errors 定义一个 500.blade.php 文件,Laravel 会默认先展示这个视图文件的内容。如果没有自定义,那就返回那个常见的 :

Whoops, looks like something went wrong.
总结

Laravel 的异常处理通常会转化为 HTTPException,而且我们在使用 AJAX 的时候也是可以直接用 expectsJson() 来判断返回什么格式的信息。这样基本上解决了 90% 以上的应用场景了。

关注 codecasts 公众号,定期送书送福利!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/23150.html

相关文章

  • Laravel异常处理和日志

    摘要:学和,你真应该来的在的应用当中使用异常处理其实是很有用的,它可以追踪到你的错误在哪,并且你的异常信息也是可以直接保存到中的,所以,这样的机制也给了我们查看异常的便利。自定义其实背后也不是那么神秘,就是使用了社区非常棒的一个日志处理。 学 Laravel 和 Vuejs,你真应该来 codecasts.com 的 在 Laravel 的应用当中使用异常处理其实是很有用的,它可以追踪到你的...

    vvpvvp 评论0 收藏0
  • Laravel核心解读--异常处理

    摘要:请求未通过的验证时会抛出此异常。异常处理是非常重要但又容易让开发者忽略的功能,这篇文章简单解释了内部异常处理的机制以及扩展异常处理的方式方法。 异常处理是编程中十分重要但也最容易被人忽视的语言特性,它为开发者提供了处理程序运行时错误的机制,对于程序设计来说正确的异常处理能够防止泄露程序自身细节给用户,给开发者提供完整的错误回溯堆栈,同时也能提高程序的健壮性。 这篇文章我们来简单梳理一下...

    includecmath 评论0 收藏0
  • Laravel异常:捕获,处理和创建

    摘要:很多开发者在开发过程中都会遇到异常,处理过程大同小异捕获然后处理,事实上也确实是如此。但本文不打算谈太多错误与异常的原理,只是从自带的入手,谈一谈怎样用一个更好的方式处理错误信息。好处是及时捕获不可预知的错误,给用户一个更好的体验。 很多开发者在开发过程中都会遇到异常,处理过程大同小异:捕获然后处理,事实上也确实是如此。但本文不打算谈太多错误与异常的原理,只是从laravel自带的Ex...

    lbool 评论0 收藏0
  • 自定义 Laravel Validator 所返回的响应

    摘要:但是,这个响应的状态码,是。众所周知的验证器会抛出一个异常,此异常在被捕获后会被的基异常处理器给渲染成响应判断是否为请求也是在这里做的。 原文地址:https://prinzeugen.net/custom... 不得不说 Laravel 的 Validation 是极好的,非常易于使用,麻麻再也不用担心我要写一大堆验证啦 ~( ^ω^) 但是这个 Validator 有一个神秘的地方...

    dack 评论0 收藏0
  • Laravel 中使用 Slack 进行异常通知

    摘要:是一款即时通信软件,类似于,它提供开放的,可以调用它向自己团队中指定的个人或者频道发送消息,因此用它来进行异常通知是再合适不过的。这样,当程序中出现异常时,运维能在第一时间收到相关的通知信息,方便及时处理了。 异常处理是软件开发过程中无法逃避的问题。对于一套设计良好代码高效的程序,出现异常的可能性会比较低,但这并不意味着不会出现异常,有些异常甚至会引起严重的后果,所以如何及时的发现程序...

    imccl 评论0 收藏0

发表评论

0条评论

shadajin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<