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