不少开发者在开发过程当中都会遇到异常,处理过程大同小异:捕获而后处理,事实上也确实是如此。
但本文不打算谈太多错误与异常的原理,只是从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
类中,咱们也能够自定义返回的数据格式和状态码等等。在工做中,我我的比较喜欢建一些自定义的异常类,也会很好管理。开发