资讯专栏INFORMATION COLUMN

Laravel异常:捕获,处理和创建

lbool / 1035人阅读

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

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

异常

先举个简单的例子,在laravel中,如果一个Model找不到或者没有,很容易就抛出一个异常,大家常见的Whoops, something went wrong诸如此类。这也只是在APP_DEBUG=false的情况下,但这并不能带给用户更有用的信息。

User::findOrFail(1);

findOrFail方法在Model没有的情况下会显示:Sorry, the page you are looking for could not be found.。这是一个404的错误页面,很多时候都应该这样返回,如果我们想知道更多有用的信息呢?

try...catch

我在工作中也喜欢用try catch来处理可能会抛出的异常,也建议大家这么做。好处是及时捕获不可预知的错误,给用户一个更好的体验。
简单的demo,如下

    try {
        $user = User::findOrFail(1);
    } catch (ModelNotFoundException $exception) {
        return back()->withError($exception->getMessage())->withInput();
    }

我们也可以这样:

if (! User::find(1)) {
    throw new UserNotFoundException("...", 404);
}
自定义异常

Laravel框架允许我们自定义exception
执行命令

php artisan make:exception UserNotFoundException

系统会自动在Exceptions目录下创建一个UserNotFoundException类,这个类继承了Exception,这就给了我们一个自由发挥的机会

namespace AppExceptions;

use Exception;

class UserNotFoundException extends Exception
{
    public function render($request, $e) 
    {
        if ($request->expectsJson()) {
            // 如果是ajax请求...
        }
        
        return redirect()->to("...");
    }
}
判断异常

Exceptions中的Handle.php文件中,我们看到有个render()方法,这里就是我们判断自定义异常的地方

// Handle.php
if ($exception instanceof UserNotFoundException) {
   return $exception->render($exception, $request);
}

可以看到,我们只需要判断抛出的异常是否是UserNotFoundException的实例即可。
而在UserNotFoundException类中,我们也可以自定义返回的数据格式和状态码等等。在工作中,我个人比较喜欢建一些自定义的异常类,也会很好管理。

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

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

相关文章

  • Laravel核心解读--异常处理

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

    includecmath 评论0 收藏0
  • Laravel学习笔记之Errors Tracking神器——Sentry

    摘要:中异常处理类主要包含两个方法和,其中就是主要用来向第三方发送异常报告,这里选择向这个神器发送异常报告,并使用通知开发人员。通过也能发现的执行流程。 说明:Laravel学习笔记之bootstrap源码解析中聊异常处理时提到过Sentry这个神器,并打算以后聊聊这款神器,本文主要就介绍这款Errors Tracking神器Sentry,Sentry官网有一句话个人觉得帅呆了: Stop ...

    xiguadada 评论0 收藏0
  • Laravel中使用数据库事务以及捕获事务失败后的异常

    摘要:在中要想在数据库事务中运行一组操作,则可以在中使用方法。如果在事务的闭包内抛出异常,事务将会被自动还原。 Description 在Laravel中要想在数据库事务中运行一组操作,则可以在 DB facade 中使用 transaction 方法。如果在事务的闭包内抛出异常,事务将会被自动还原。如果闭包运行成功,事务将被自动提交。你不需要担心在使用 transaction 方法时还需要...

    newtrek 评论0 收藏0
  • laravel中Dingo api如何Custom ExceptionHandler

    摘要:背景在近期使用处理接口时,发现本身中无法捕获异常。后来查阅资料发现,接管了请求的异常处理。导致无法自定义错误返回,很是头疼。最后在的找到了处理方法。 背景 在近期使用Dingo api处理接口时,发现laravel本身appExceptionsHandler中无法捕获异常。 后来查阅资料发现,Dingo api接管了api请求的异常处理。导致无法自定义错误返回,很是头疼。 最后在di...

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

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

    dack 评论0 收藏0

发表评论

0条评论

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