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

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

异常

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

User::findOrFail(1);

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

try...catch

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

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

咱们也能够这样:oop

if (! User::find(1)) {
    throw new UserNotFoundException('...', 404);
}

自定义异常

Laravel框架容许咱们自定义exception
执行命令spa

php artisan make:exception UserNotFoundException

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

namespace App\Exceptions;

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类中,咱们也能够自定义返回的数据格式和状态码等等。在工做中,我我的比较喜欢建一些自定义的异常类,也会很好管理。开发

相关文章
相关标签/搜索