首頁 >後端開發 >php教程 >Yii框架官方指南系列46-專題:錯誤處理

Yii框架官方指南系列46-專題:錯誤處理

黄舟
黄舟原創
2017-02-16 09:37:441160瀏覽



Yii提供了一個完整的,基於PHP5異常處理的錯誤處理機制。當一個應用程式開始運行,進行使用者請求的處理的時候,會註冊handleError方法來處理PHP warnings和notices資訊;同時也註冊加handleException方法來處理未被捕獲的PHP異常。因此,如果在應用程式運作期間出現一個PHP warning/notice 或一個未捕獲的PHP異常,錯誤處理器就會接過控制權來運作必要的處理機制。

提示: 錯誤處理器的註冊是在應用中的constructor方法中進行的,使用了PHP函數set_exception_handler 和set_error_handler。 如果你不想讓Yii來處理錯誤和異常,你可以在入口文件中定義YII_ENABLE_ERROR_HANDLERYII_ENABLE_EXCEPTION_HANDLER為false.

) exceptionHandler)將會被觸發。如果錯誤或異常未被任何事件所處理,那麼就需要執行errorHandler元件來處理了。

1. 引發異常

在Yii中引發異常和在普通PHP檔案中沒什麼兩樣。你可以使用下面的程式碼來拋出異常:


throw new ExceptionClass('错误信息');

Yii定義了兩個異常類:CException和CHttpException。前者是一個通用的異常類,而後者用於對最終用戶顯示異常訊息。同時,後者有一個statusCode屬性來代表HTTP狀態碼。異常的類型決定了顯示效果,下面會細說。

提示: 想要告訴使用者某個操作是錯誤的,那麼引發一個CHttpException異常是最簡單的方法了。比方說,如果使用者在URL中提供了一個無效的ID值,我們可以顯示一個404錯誤:


// 如果提交的ID是无效的
throw new CHttpException(404,'此页面不存在');

2.顯示錯誤

當一個錯誤被轉發給當一個錯誤被轉發給當一個錯誤的時候,它會選擇適當的視圖來顯示錯誤。如果這個錯誤要顯示給最終使用者的(比如說一個CHttpException)那麼就會使用一個名為errorXXX的視圖來顯示錯誤。這個XXX代表著HTTP錯誤碼(比如說400,404,500等)。如果這是個內部錯誤,應該只能被開發者看到,那麼將使用的視圖名稱是exception。在後一種中,將會顯示完整的呼叫棧資訊和錯誤行資訊。

訊息: 當應用運作在生產模式時,所有的錯誤,包括內部錯誤都會使用視圖errorXXX。這是因為所呼叫的堆疊資訊和錯誤行資訊可能包含一些敏感資訊。在這種情況下,開發者應該依靠錯誤日誌來確定錯誤原因。

CErrorHandler會搜尋適當的視圖來顯示錯誤訊息,搜尋的順序如下:

  1. WebRoot/themes/ThemeName/views/system: 在目前主題視圖下的system

  2. WebRoot/protected/views/system: 在套用的預設視圖的system目錄中。

  3. yii/framework/views: 在Yii提供的標準視圖目錄中。

因此,如果你想要自訂錯誤顯示,可以直接在system視圖目錄中或主題的system視圖目錄中建立一個視圖檔案。每個視圖檔案都是一個包含許多HTML程式碼的普通PHP檔案。參考框架的view目錄下的文件,可以取得更多資訊。

3. 使用一個動作來處理錯誤

Yii也可以使用控制器 動作來處理錯誤顯示。實現的方法是在應用程式的設定檔中配置一個錯誤處理器。


return array(
    ......
    'components'=>array(
        'errorHandler'=>array(
            'errorAction'=>'site/error',
        ),
    ),
);

上面的程式碼中,我們配置了CErrorHandler::errorAction屬性,屬性值是一個路由site/error。這個路由指向SiteController中的error。當然,你也可以使用其他的路由。

我們可以這樣來寫error動作:


public function actionError()
{
    if($error=Yii::app()->errorHandler->error)
        $this->render('error', $error);
}

在這個動作中,首先從CErrorHandler::error中取得詳細的錯誤訊息。如果取得的資訊非空,就使用CErrorHandler::error回傳的資訊來渲染error視圖。 CErrorHandler::error回傳的資訊是一個數組,結構如下:

  • code: HTTP 狀態碼(如403, 500);

  • CHg(例如 Egocintype漿:類型錯誤。 );

    message
  • : 錯誤訊息;
  • file
  • : 發生錯誤的PHP檔案名稱
  • : 錯誤所在 race: 錯誤的呼叫堆疊資訊;

  • source: 發生錯誤的程式碼的上下文。

提示: 我們檢查CErrorHandler::error是否為空的原因是error動作可以被用戶訪問到,這時候也許並沒有什麼錯誤。當我們傳遞$error數組給視圖,它將會自動釋放為獨立的變數。所以,在視圖中我們可以使用$code$type來存取這些資訊。

4. 訊息記錄 

一個error等級的錯誤訊息會在錯誤發生時候被記錄。如果這個錯誤是由PHP warning 或notice引發的,那麼這個訊息將會被記錄在php這個分類中;如果錯誤訊息是由未捕獲的異常所引起的,那麼分類將是exception.ExceptionClassName(對於CHttpException來說,它的statusCode也會被追加到分類名稱中)。開發者可以使用這些記錄來監測應用程式執行時候的錯誤訊息

 以上就是Yii框架官方指南系列46-專題:錯誤處理的內容,更多相關內容請關注PHP中文網(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn