溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Laravel中如何進(jìn)行異常處理

發(fā)布時間:2022-10-09 17:45:05 來源:億速云 閱讀:127 作者:iii 欄目:編程語言

這篇文章主要介紹“Laravel中如何進(jìn)行異常處理”,在日常操作中,相信很多人在Laravel中如何進(jìn)行異常處理問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Laravel中如何進(jìn)行異常處理”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

基本配置

在開始研究異常處理類之前,讓我們先來看看幾個和異常相關(guān)且很重要的參數(shù)配置。

打開 config/app.php 文件,并仔細(xì)的看看下面的代碼片段。

...
...
/*
|--------------------------------------------------------------------------
| 應(yīng)用的調(diào)試模式
|--------------------------------------------------------------------------
|
| 當(dāng)引用處于調(diào)試模式,將會顯示錯誤產(chǎn)生式的詳細(xì)堆棧信息
| 如果禁用,則只顯示一個簡單的錯誤頁面
|
*/

'debug' => env('APP_DEBUG', false),
...
...

從參數(shù)的名稱可以猜到,如果設(shè)置為 TRUE,將有利于我們調(diào)試應(yīng)用產(chǎn)生的錯誤。默認(rèn)值由 .env 環(huán)境變量配置文件中的  APP_DEBUG 參數(shù)指定。

在開發(fā)環(huán)境下,建議你將它設(shè)置為 TRUE ,這樣,通過清晰的錯誤堆棧信息,能很快的定位錯誤產(chǎn)生的原因并修復(fù)。 另外,當(dāng)處于正式環(huán)境是,我們需要通過環(huán)境變量的配置項來關(guān)閉它,當(dāng)錯誤產(chǎn)生式將只顯示通用的提示頁面。

除了將錯誤顯示在頁面上,Laravel 也允許你將錯誤記錄到日志文件中。現(xiàn)在,讓我們來看看日志相關(guān)的配置,打開 config/app.php 文件,并仔細(xì)的看看下面的代碼片段。

...
...
'log' => env('APP_LOG', 'single'),

'log_level' => env('APP_LOG_LEVEL', 'debug'),
...
...

Laravel 框架中,是使用 Monolog 庫來記錄日志的。你可以通過上面的配置項來配置 Monolog 庫。

默認(rèn)的日志文件保存路徑為 storage/logs/laravel.log,通常情況下,你無需更改它。與此同時,你可以通過  APP_LOG_LEVEL 來指定需要被記錄到日志文件的錯誤級別。

前面介紹了異常和日志的基本配置。

接下來,我們看看 Laravel 應(yīng)用默認(rèn)的異常處理類。打開 app/Exceptions/Handler.php 文件.

expectsJson()) {
            return response()->json(['error' => 'Unauthenticated.'], 401);
        }

        return redirect()->guest(route('login'));
    }
}

上面的處理類主要包含2個功能:報告和顯示所有的異常信息。

讓我們仔細(xì)看一眼 report 方法。

/**
 * 報告或記錄一個異常。
 *
 * 這是一個將異常發(fā)送給 Sentry 和 Bugsnag 等機構(gòu)的好時機。
 *
 * @param  \Exception  $exception
 * @return void
 */
public function report(Exception $exception)
{
    parent::report($exception);
}

report 方法用于將錯誤記錄到日志文件中。同時,關(guān)注一項重要的 dontReport 屬性,它列出了所有不應(yīng)該被記錄到日志的異常類別。

接下來,我們介紹 render 方法。

/**
 * 將異常渲染至 HTTP 響應(yīng)值中。
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $exception
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $exception)
{
    return parent::render($request, $exception);
}

如果說 report 方法是用于記錄或報告錯誤,那么 render 方法是用于將錯誤渲染顯示在屏幕上。事實上,當(dāng)異常發(fā)生時,這個方法決定了哪些內(nèi)容將被展示給用戶。

render 方法也允許你針對不同類別的錯誤自定義響應(yīng)值,這部分內(nèi)容我們將在下一章學(xué)習(xí)。

最后, unauthenticated 方法處理了 AuthenticationException 異常,你能夠在此決定當(dāng)用戶訪問了一個未授權(quán)頁面時所展示的內(nèi)容。

自定義異常類

在這一節(jié),我們將創(chuàng)建一個自定義異常類,用于處理 CustomException 類別的異常。創(chuàng)建自定義異常類背后的想法是更輕松地管理自定義異常同時顯示自定義響應(yīng)。

開始著手創(chuàng)建一個文件 app/Exceptions/CustomException.php ,內(nèi)容如下所示。

view(
                'errors.custom',
                array(
                    'exception' => $this
                )
        );
    }
}

重要的是需要注意 CustomException 類必須繼承核心 Exception 類。為了演示用途,我們僅僅討論了 render 方法,但顯然你也能夠自定義修改 report 方法。

正如你看到的,在樣例中我們將用戶重定向至 errors.custom 錯誤頁面。通過這種方式,你能夠為特定類型的異常實現(xiàn)自定義的錯誤頁面。

當(dāng)然,我們需要創(chuàng)建一個關(guān)聯(lián)的視圖文件 resources/views/errors/custom.blade.php。

Exception details: {{ $exception->getMessage() }}

登錄后復(fù)制

這是一個相當(dāng)簡單的視圖文件,只顯示一行錯誤消息,不過你也可以按照自己希望的方式設(shè)計這個視圖。

我們也需要在 app/Exceptions/Handler.php 文件的 render 方法中進(jìn)行一些修改,保證我們的自定義異常類能夠被調(diào)用。讓我們將 app/Exceptions/Handler.php 文件中的 render 方法替換為以下內(nèi)容。

...
...
/**
 * 將異常渲染至 HTTP 響應(yīng)值中。
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $exception
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $exception)
{
    if ($exception instanceof \App\Exceptions\CustomException)  {
        return $exception->render($request);
    }

    return parent::render($request, $exception);
}
...
...

正如你所看到的,我們會在 render 方法中首先檢查異常的類型。如果異常的類別是 \App\Exceptions\CustomException ,我們將調(diào)用這個類的 render 方法。

一切準(zhǔn)備就緒?,F(xiàn)在我們創(chuàng)建一個控制  app/Http/Controllers/ExceptionController.php  來測試自定義的異常類。

<?php
namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class ExceptionController extends Controller
{
    public function index()
    {
        // 出錯了,你可以拋出自定義的異常 CustomException
        throw new \App\Exceptions\CustomException('Something Went Wrong.');
    }
}

當(dāng)然,你需要先在 routes/web.php 文件中添加相關(guān)的路由,就像下面一樣。

// Exception routes
Route::get('exception/index', 'ExceptionController@index');

之后,你可以瀏覽 http://your-laravel-site.com/exception/ind... 地址來查看是否和預(yù)期的一樣。一切正常的話,頁面將顯示我們前面配置 errors.custom 視圖。

到此,關(guān)于“Laravel中如何進(jìn)行異常處理”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI