錯誤


設定

  • #異常處理器
  • Report 方法
  • Render 方法
    • Reportable & Renderable 異常
    • HTTP 異常
    • 自訂HTTP 錯誤頁面

#介紹

當你啟動一個新的Laravel 專案時,錯誤及異常處理是已為你配置好了的。 App\Exceptions\Handler 類別負責記錄應用程式觸發的所有異常並呈現給使用者。在本文檔中,我們將深入探討這個類別。

############

設定

你的 config/app.php 設定檔中的 debug 選項決定了對於一個錯誤實際上將顯示多少資訊給使用者。預設情況下,該選項的設定將遵照儲存在 .env 檔案中的 APP_DEBUG 環境變數的值。

對於本地開發,你應該將 APP_DEBUG 環境變數的值設為 true 。在生產環境中,該值應始終為 false 。如果在生產中將該值設為 true ,則可能會將敏感配置值暴露給應用程式的終端使用者。

#異常處理器

# #Report 方法

所有例外都是由

App\Exceptions\Handler 類別處理的。這個類別包含兩個方法: report

render

。我們將詳細剖析這些方法。 report 方法用於記錄例外狀況或將它們傳送給如 Bugsnag 或 Sentry 等外部服務。預設情況下, report 方法將異常傳遞給記錄異常的基底類別。不過,你可以任何自己喜歡的方式來記錄異常。

例如,如果你需要以不同方式報告不同類型的異常,則可以使用PHP 的
instanceof
比較運算子:

/**
 * 报告或记录异常
 *
 * 此处是发送异常给 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 例外

除了在異常處理器的reportrender

方法中檢查異常類型,你還可以直接在自訂異常上定義
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 異常

一些例外狀況用於描述產生自伺服器的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

變數傳遞給檢視:
<h2>{{ $exception->getMessage() }}</h2>
你可以使用vendor:publish
Artisan 指令來定義錯誤範本頁面。模板頁面產生後,就可以自訂模板頁面的內容:
php artisan vendor:publish --tag=laravel-errors
###本文章首發在 ###LearnKu.com### 網站上。 ######