Laravel 9 保姆級視頻教程,想學(xué)不會(huì)都難!進(jìn)入學(xué)習(xí)
在本文中,我們將探討 Laravel Web 框架中最重要和最少討論的功能之一 – 異常處理
。 Laravel 帶有一個(gè)內(nèi)置的異常處理程序,可以讓您輕松地以友好的方式報(bào)告和呈現(xiàn)異常。
在文章的前半部分,我們將探討異常處理程序提供的默認(rèn)設(shè)置。 事實(shí)上,我們首先會(huì)通過默認(rèn)的 Handler 類來理解 Laravel 是如何處理異常的。
在文章的后半部分,我們將繼續(xù)介紹如何創(chuàng)建自定義異常處理程序,以便您可以捕獲自定義異常。
基本配置
在開始研究異常處理類之前,讓我們先來看看幾個(gè)和異常相關(guān)且很重要的參數(shù)配置。
打開 config/app.php
文件,并仔細(xì)的看看下面的代碼片段。
... ... /* |-------------------------------------------------------------------------- | 應(yīng)用的調(diào)試模式 |-------------------------------------------------------------------------- | | 當(dāng)引用處于調(diào)試模式,將會(huì)顯示錯(cuò)誤產(chǎn)生式的詳細(xì)堆棧信息 | 如果禁用,則只顯示一個(gè)簡單的錯(cuò)誤頁面 | */ 'debug' => env('APP_DEBUG', false), ... ...
從參數(shù)的名稱可以猜到,如果設(shè)置為 TRUE
,將有利于我們調(diào)試應(yīng)用產(chǎn)生的錯(cuò)誤。默認(rèn)值由 .env
環(huán)境變量配置文件中的 APP_DEBUG
參數(shù)指定。
在開發(fā)環(huán)境下,建議你將它設(shè)置為 TRUE
,這樣,通過清晰的錯(cuò)誤堆棧信息,能很快的定位錯(cuò)誤產(chǎn)生的原因并修復(fù)。 另外,當(dāng)處于正式環(huán)境是,我們需要通過環(huán)境變量的配置項(xiàng)來關(guān)閉它,當(dāng)錯(cuò)誤產(chǎn)生式將只顯示通用的提示頁面。
除了將錯(cuò)誤顯示在頁面上,Laravel 也允許你將錯(cuò)誤記錄到日志文件中?,F(xiàn)在,讓我們來看看日志相關(guān)的配置,打開 config/app.php
文件,并仔細(xì)的看看下面的代碼片段。
... ... 'log' => env('APP_LOG', 'single'), 'log_level' => env('APP_LOG_LEVEL', 'debug'), ... ...
Laravel 框架中,是使用 Monolog 庫來記錄日志的。你可以通過上面的配置項(xiàng)來配置 Monolog 庫。
默認(rèn)的日志文件保存路徑為 storage/logs/laravel.log
,通常情況下,你無需更改它。與此同時(shí),你可以通過 APP_LOG_LEVEL
來指定需要被記錄到日志文件的錯(cuò)誤級別。
前面介紹了異常和日志的基本配置。
接下來,我們看看 Laravel 應(yīng)用默認(rèn)的異常處理類。打開 app/Exceptions/Handler.php
文件.
expectsJson()) { return response()->json(['error' => 'Unauthenticated.'], 401); } return redirect()->guest(route('login')); } }
上面的處理類主要包含2個(gè)功能:報(bào)告和顯示所有的異常信息。
讓我們仔細(xì)看一眼 report
方法。
/** * 報(bào)告或記錄一個(gè)異常。 * * 這是一個(gè)將異常發(fā)送給 Sentry 和 Bugsnag 等機(jī)構(gòu)的好時(shí)機(jī)。 * * @param Exception $exception * @return void */ public function report(Exception $exception) { parent::report($exception); }
report 方法用于將錯(cuò)誤記錄到日志文件中。同時(shí),關(guān)注一項(xiàng)重要的 dontReport
屬性,它列出了所有不應(yīng)該被記錄到日志的異常類別。
接下來,我們介紹 render
方法。
/** * 將異常渲染至 HTTP 響應(yīng)值中。 * * @param IlluminateHttpRequest $request * @param Exception $exception * @return IlluminateHttpResponse */ public function render($request, Exception $exception) { return parent::render($request, $exception); }
如果說 report
方法是用于記錄或報(bào)告錯(cuò)誤,那么 render
方法是用于將錯(cuò)誤渲染顯示在屏幕上。事實(shí)上,當(dāng)異常發(fā)生時(shí),這個(gè)方法決定了哪些內(nèi)容將被展示給用戶。
render
方法也允許你針對不同類別的錯(cuò)誤自定義響應(yīng)值,這部分內(nèi)容我們將在下一章學(xué)習(xí)。
最后, unauthenticated
方法處理了 AuthenticationException
異常,你能夠在此決定當(dāng)用戶訪問了一個(gè)未授權(quán)頁面時(shí)所展示的內(nèi)容。
自定義異常類
在這一節(jié),我們將創(chuàng)建一個(gè)自定義異常類,用于處理 CustomException
類別的異常。創(chuàng)建自定義異常類背后的想法是更輕松地管理自定義異常同時(shí)顯示自定義響應(yīng)。
開始著手創(chuàng)建一個(gè)文件 app/Exceptions/CustomException.php
,內(nèi)容如下所示。
view( 'errors.custom', array( 'exception' => $this ) ); } }
重要的是需要注意 CustomException
類必須繼承核心 Exception
類。為了演示用途,我們僅僅討論了 render 方法,但顯然你也能夠自定義修改 report 方法。
正如你看到的,在樣例中我們將用戶重定向至 errors.custom
錯(cuò)誤頁面。通過這種方式,你能夠?yàn)樘囟愋偷漠惓?shí)現(xiàn)自定義的錯(cuò)誤頁面。
當(dāng)然,我們需要?jiǎng)?chuàng)建一個(gè)關(guān)聯(lián)的視圖文件 resources/views/errors/custom.blade.php
。
Exception details: {{ $exception->getMessage() }}
這是一個(gè)相當(dāng)簡單的視圖文件,只顯示一行錯(cuò)誤消息,不過你也可以按照自己希望的方式設(shè)計(jì)這個(gè)視圖。
我們也需要在 app/Exceptions/Handler.php
文件的 render 方法中進(jìn)行一些修改,保證我們的自定義異常類能夠被調(diào)用。讓我們將 app/Exceptions/Handler.php
文件中的 render 方法替換為以下內(nèi)容。
... ... /** * 將異常渲染至 HTTP 響應(yīng)值中。 * * @param IlluminateHttpRequest $request * @param Exception $exception * @return IlluminateHttpResponse */ public function render($request, Exception $exception) { if ($exception instanceof AppExceptionsCustomException) { return $exception->render($request); } return parent::render($request, $exception); } ... ...
正如你所看到的,我們會(huì)在 render 方法中首先檢查異常的類型。如果異常的類別是 AppExceptionsCustomException
,我們將調(diào)用這個(gè)類的 render 方法。
一切準(zhǔn)備就緒?,F(xiàn)在我們創(chuàng)建一個(gè)控制 app/Http/Controllers/ExceptionController.php
來測試自定義的異常類。
登錄后復(fù)制當(dāng)然,你需要先在
routes/web.php
文件中添加相關(guān)的路由,就像下面一樣。
// Exception routes Route::get('exception/index', 'ExceptionController@index');登錄后復(fù)制之后,你可以瀏覽 http://your-laravel-site.com/exception/ind... 地址來查看是否和預(yù)期的一樣。一切正常的話,頁面將顯示我們前面配置
errors.custom
視圖。就這樣,你就可以按自己方式來處理 Laravel 中的異常。
完!盡情享受 Laravel 帶來的編碼的樂趣吧!總結(jié)
今天,我們認(rèn)真學(xué)習(xí)了 Laravel 中的異常處理特性。在文章的開頭,我們搜索了 Laravel 提供的一些基礎(chǔ)配置,用于顯示和報(bào)告異常。緊接著,我們簡要介紹了默認(rèn)的異常處理類。
在文章的后半部分,我們通過創(chuàng)建一個(gè)自定義異常處理類,演示如何在應(yīng)用中處理自定義的異常。
對于那些剛剛起步學(xué)習(xí) Laravel ,或者期待拓展閱讀相關(guān)知識(shí)、網(wǎng)站、應(yīng)用擴(kuò)展的讀者,這里有一系列您能夠?qū)W習(xí)的內(nèi)容,參見 Envato Market 。
期待聽到任何形式的咨詢或建議!
原文地址:https://code.tutsplus.com/tutorials/exception-handling-in-laravel--cms-30210
譯文地址:https://learnku.com/laravel/t/8783/exception-handling-in-laravel
【