錯誤
錯誤
錯誤處理
介紹
當你啟動一個新的 Laravel 項目時,錯誤及異常處理是已為你配置好了的。 App\Exceptions\Handler
類負責記錄應(yīng)用程序觸發(fā)的所有異常并呈現(xiàn)給用戶。在本文檔中,我們將深入探討這個類。
配置
你的 config/app.php
配置文件中的 debug
選項決定了對于一個錯誤實際上將顯示多少信息給用戶。默認情況下,該選項的設(shè)置將遵照存儲在 .env
文件中的 APP_DEBUG
環(huán)境變量的值。
對于本地開發(fā),你應(yīng)該將 APP_DEBUG
環(huán)境變量的值設(shè)置為 true
。在生產(chǎn)環(huán)境中,該值應(yīng)始終為 false
。如果在生產(chǎn)中將該值設(shè)置為 true
,則可能會將敏感配置值暴露給應(yīng)用程序的終端用戶。
異常處理器
Report 方法
所有異常都是由 App\Exceptions\Handler
類處理的。這個類包含兩個方法: report
和 render
。我們將詳細剖析這些方法。 report
方法用于記錄異?;?qū)⑺鼈儼l(fā)送給如 Bugsnag 或 Sentry 等外部服務(wù)。默認情況下, report
方法將異常傳遞給記錄異常的基類。不過,你可以任何自己喜歡的方式來記錄異常。
例如,如果你需要以不同方式報告不同類型的異常,則可以使用 PHP 的 instanceof
比較運算符:
/** * 報告或記錄異常 * * 此處是發(fā)送異常給 Sentry、Bugsnag 等外部服務(wù)的好位置。 * * @param \Exception $exception * @return void */ public function report(Exception $exception){ if ($exception instanceof CustomException) { // } parent::report($exception); }
{tip} 不要在
report
方法中進行太多的instanceof
檢查,而應(yīng)考慮使用 可報告異常(Reportable exception) 。
全局日志
在正常情況下, Laravel 會自動將當前用戶的 ID 作為數(shù)據(jù)添加到每一條異常日志中。 你可以在通過重寫 App\Exceptions\Handler
類中的 context
方法來定義你的全局環(huán)境變量。 之后,這個變量將包含在每一條異常日志中:
/** * 定義默認的環(huán)境變量 * * @return array */ protected function context(){ return array_merge(parent::context(), [ 'foo' => 'bar', ]); }
report
輔助函數(shù)
有時你可能需要報告異常,但又不希望終止當前請求的處理。 report
輔助函數(shù)允許你使用異常處理器的 report
方法在不顯示錯誤頁面的情況下快速報告異常:
public function isValid($value){ try { // 驗證值... } catch (Exception $e) { report($e); return false; } }
按類型忽略異常
異常處理器的 $dontReport
屬性包含一組不會被記錄的異常類型。例如,由 404 錯誤導致的異常以及其他幾種類型的錯誤不會寫入日志文件。你可以根據(jù)需要添加其他異常類型到此數(shù)組中:
/** * 不應(yīng)被報告的異常類型清單。 * * @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
方法負責將給定的異常轉(zhuǎn)換為將被發(fā)送回瀏覽器的 HTTP 響應(yīng)。默認情況下,異常將傳遞給為你生成響應(yīng)的基類。不過,你可以按自己意愿檢查異常類型或返回自己的自定義響應(yīng):
/** * 將異常轉(zhuǎn)換為 HTTP 響應(yīng)。 * * @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
方法。當定義了這些方法時,它們會被框架自動調(diào)用:
<?php namespace App\Exceptions;use Exception; class RenderException extends Exception{ /** * 報告異常 * * @return void */ public function report() { // } /** * 轉(zhuǎn)換異常為 HTTP 響應(yīng) * * @param \Illuminate\Http\Request * @return \Illuminate\Http\Response */ public function render($request) { return response(...); } }
{tip} 你可以聲明
report
方法和必要參數(shù),它們將通過 Laravel 的 服務(wù)容器 自動注入方法中
HTTP 異常
一些異常用于描述產(chǎn)生自服務(wù)器的 HTTP 錯誤代碼。例如,「頁面未找到」錯誤 (404), 「未經(jīng)授權(quán)的錯誤」(401) ,甚至可以是開發(fā)人員引起的 500 錯誤。 你可以使用 abort
輔助函數(shù)從應(yīng)用程序的任何地方生成這樣的響應(yīng):
abort(404);
輔助函數(shù) abort
會立即引發(fā)一個由異常處理器渲染的異常。你還可選擇性地提供響應(yīng)文本:
abort(403, 'Unauthorized action.');
自定義 HTTP 錯誤頁面
Laravel 可以輕松顯示各種 HTTP 狀態(tài)代碼的自定義錯誤頁面。例如,如果你希望自定義 404 HTTP 狀態(tài)碼的錯誤頁面,可以創(chuàng)建一個 resources/views/errors/404.blade.php
視圖文件。該文件將被用于你的應(yīng)用程序產(chǎn)生的所有 404 錯誤。此目錄中的視圖文件的命名應(yīng)匹配它們對應(yīng)的 HTTP 狀態(tài)碼。由 abort
函數(shù)引發(fā)的 HttpException
實例將作為 $exception
變量傳遞給視圖:
<h2>{{ $exception->getMessage() }}</h2>
你可以使用 vendor:publish
Artisan 命令來定義錯誤模板頁面。模板頁面生成后,就可以自定義模板頁面的內(nèi)容:
php artisan vendor:publish --tag=laravel-errors