在本文中,我們將探討 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 App\Exceptions; use Exception; use Illuminate\Auth\AuthenticationException; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; class Handler extends ExceptionHandler { /** * 定义无需报告的异常类型 * * @var array */ protected $dontReport = [ \Illuminate\Auth\AuthenticationException::class, \Illuminate\Auth\Access\AuthorizationException::class, \Symfony\Component\HttpKernel\Exception\HttpException::class, \Illuminate\Database\Eloquent\ModelNotFoundException::class, \Illuminate\Session\TokenMismatchException::class, \Illuminate\Validation\ValidationException::class, ]; /** * 报告或者通过日志记录一个异常 * * 可以在这个方法中将异常报告给 Sentry, Bugsnag 等平台 * * @param \Exception $exception * @return void */ public function report(Exception $exception) { parent::report($exception); } /** * 将异常通过 Http 返回 * * @param \Illuminate\Http\Request $request * @param \Exception $exception * @return \Illuminate\Http\Response */ public function render($request, Exception $exception) { return parent::render($request, $exception); } /** * 将认证相关的异常转换为未认证的响应(401) * * @param \Illuminate\Http\Request $request * @param \Illuminate\Auth\AuthenticationException $exception * @return \Illuminate\Http\Response */ 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 \Illuminate\Http\Request $request * @param \Exception $exception * @return \Illuminate\Http\Response */ public function render($request, Exception $exception) { return parent::render($request, $exception); }
如果說 report
方法是用來記錄或報告錯誤,那麼 render
方法是用來將錯誤渲染顯示在螢幕上。事實上,當異常發生時,這個方法決定了哪些內容將被展示給使用者。
render
方法也允許你針對不同類別的錯誤自訂回應值,這部分內容我們將在下一章學習。
最後, unauthenticated
方法處理了 AuthenticationException
異常,你能夠在此決定當使用者存取了一個未授權頁面時所展示的內容。
在這一節,我們將建立一個自訂異常類,用於處理 CustomException
類別的異常。創建自訂異常類別背後的想法是更輕鬆地管理自訂異常同時顯示自訂回應。
開始著手建立一個檔案 app/Exceptions/CustomException.php
,內容如下所示。
<?php namespace App\Exceptions; use Exception; class CustomException extends Exception { /** * 报告这个异常。 * * @return void */ public function report() { } /** * 将异常渲染至 HTTP 响应值中。 * * @param \Illuminate\Http\Request * @return \Illuminate\Http\Response */ 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 \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
,我們將呼叫這個類別的 render 方法。
一切準備就緒。現在我們建立一個控制 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.'); } }
当然,你需要先在 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视频教程】
以上是一文詳解Laravel中怎麼進行異常處理的詳細內容。更多資訊請關注PHP中文網其他相關文章!