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類中,咱們也能夠自定義返回的數據格式和狀態碼等等。在工做中,我我的比較喜歡建一些自定義的異常類,也會很好管理。開發

相關文章
相關標籤/搜索