錯誤
#介紹
當你啟動一個新的Laravel 專案時,錯誤及異常處理是已為你配置好了的。 App\Exceptions\Handler 類別負責記錄應用程式觸發的所有異常並呈現給使用者。在本文檔中,我們將深入探討這個類別。
############設定
你的 config/app.php
設定檔中的 debug
選項決定了對於一個錯誤實際上將顯示多少資訊給使用者。預設情況下,該選項的設定將遵照儲存在 .env
檔案中的 APP_DEBUG
環境變數的值。
對於本地開發,你應該將 APP_DEBUG
環境變數的值設為 true
。在生產環境中,該值應始終為 false
。如果在生產中將該值設為 true
,則可能會將敏感配置值暴露給應用程式的終端使用者。
#異常處理器
# #Report 方法
App\Exceptions\Handler 類別處理的。這個類別包含兩個方法:
report
render例如,如果你需要以不同方式報告不同類型的異常,則可以使用PHP 的。我們將詳細剖析這些方法。
report
方法用於記錄例外狀況或將它們傳送給如 Bugsnag 或 Sentry 等外部服務。預設情況下,report
方法將異常傳遞給記錄異常的基底類別。不過,你可以任何自己喜歡的方式來記錄異常。
/**
* 报告或记录异常
*
* 此处是发送异常给 Sentry、Bugsnag 等外部服务的好位置。
*
* @param \Exception $exception
* @return void
*/
public function report(Exception $exception){
if ($exception instanceof CustomException) {
//
}
parent::report($exception);
}
{tip} 不要在 report
方法中進行太多的 instanceof
檢查,而應考慮使用可報告異常(Reportable exception)。
全域日誌
在正常情況下, Laravel 會自動將目前使用者的 ID 作為資料新增至每個例外日誌中。你可以在透過重寫 App\Exceptions\Handler 類別中的
context 方法來定義你的全域環境變數。之後,這個變數將包含在每個異常日誌中:
/** * 定义默认的环境变量 * * @return array */ protected function context(){ return array_merge(parent::context(), [ 'foo' => 'bar', ]); }
report
輔助函數有時你可能需要報告異常,但又不希望終止目前請求的處理。
report
report 方法在不顯示錯誤頁面的情況下快速報告異常:
public function isValid($value){ try { // 验证值... } catch (Exception $e) { report($e); return false; } }按類型忽略異常######異常處理器的###$dontReport### 屬性包含一組不會被記錄的異常類型。例如,由 404 錯誤導致的異常以及其他幾種類型的錯誤不會寫入日誌檔案。你可以根據需要添加其他異常類型到此數組中:###
/** * 不应被报告的异常类型清单。 * * @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\Validation\ValidationException::class,];###################
Render 方法
render
方法負責將給定的例外轉換為將被傳送回瀏覽器的 HTTP 回應。預設情況下,異常將傳遞給為你產生回應的基底類別。不過,你可以依照自己意願檢查例外類型或回傳自己的自訂回應:
/** * 将异常转换为 HTTP 响应。 * * @param \Illuminate\Http\Request $request * @param \Exception $exception * @return \Illuminate\Http\Response */ public function render($request, Exception $exception){ if ($exception instanceof CustomException) { return response()->view('errors.custom', [], 500); } return parent::render($request, $exception); }
Reportable & Renderable 例外
除了在異常處理器的
report 和
render
report和
render
方法。當定義了這些方法時,它們會被框架自動呼叫:<?php namespace App\Exceptions;use Exception; class RenderException extends Exception{ /** * 报告异常 * * @return void */ public function report() { // } /** * 转换异常为 HTTP 响应 * * @param \Illuminate\Http\Request * @return \Illuminate\Http\Response */ public function render($request) { return response(...); } }
{tip} 你可以宣告report 方法和必要參數,它們會透過Laravel 的服務容器自動注入方法中
一些例外狀況用於描述產生自伺服器的HTTP 錯誤碼。例如,「頁面未找到」錯誤 (404), 「未經授權的錯誤」(401) ,甚至可以是開發人員造成的 500 錯誤。你可以使用
abort
abort(404);輔助函數abort 會立即引發一個由例外處理器渲染的例外。你也可以選擇性地提供回應文字:
abort(403, 'Unauthorized action.');
#自訂HTTP 錯誤頁面
Laravel 可以輕鬆顯示各種HTTP 狀態代碼的自訂錯誤頁面。例如,如果你希望自訂 404 HTTP 狀態碼的錯誤頁面,可以建立一個
resources/views/errors/404.blade.php 視圖檔案。該文件將用於你的應用程式產生的所有 404 錯誤。此目錄中的視圖檔案的命名應符合它們對應的 HTTP 狀態碼。由
abort
HttpException 實例將作為
$exception
php artisan vendor:publish --tag=laravel-errors###本文章首發在 ###LearnKu.com### 網站上。 ######