不少開發者在開發過程當中都會遇到異常,處理過程大同小異:捕獲而後處理,事實上也確實是如此。
但本文不打算談太多錯誤與異常的原理,只是從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
類中,咱們也能夠自定義返回的數據格式和狀態碼等等。在工做中,我我的比較喜歡建一些自定義的異常類,也會很好管理。開發