目錄
1. 引發異常
2.顯示錯誤
3. 使用一個動作來處理錯誤
首頁 後端開發 php教程 Yii框架官方指南系列46-專題:錯誤處理

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

Feb 16, 2017 am 09:37 AM



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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

使用中間件改善golang函數中的錯誤處理 使用中間件改善golang函數中的錯誤處理 Apr 24, 2024 pm 06:57 PM

使用中間件改善Go函數中的錯誤處理:引入中間件的概念,它可以攔截函數呼叫並執行特定邏輯。建立錯誤處理中間件,該中間件將錯誤處理邏輯包裝在自訂函數中。使用中間件包裝處理程序函數,以便在函數呼叫之前執行錯誤處理邏輯。根據錯誤類型返回適當的錯誤代碼,улучшениеобработкиошибоквфункцияхGoспомощьюпромежуто намсосредоточитьсянаобработкеошибо

透過異常處理,如何在 C++ 中有效處理錯誤場景? 透過異常處理,如何在 C++ 中有效處理錯誤場景? Jun 02, 2024 pm 12:38 PM

在C++中,異常處理透過try-catch區塊優雅地處理錯誤,常見的異常類型包括執行時間錯誤、邏輯錯誤和超出界限錯誤。以檔案開啟錯誤處理為例,當程式開啟檔案失敗時,它會拋出異常,並透過catch區塊列印錯誤訊息和傳回錯誤程式碼,從而在不終止程式的情況下處理錯誤。異常處理提供錯誤處理集中化、錯誤傳遞和程式碼健全性等優勢。

PHP 錯誤處理中的最佳工具和函式庫? PHP 錯誤處理中的最佳工具和函式庫? May 09, 2024 pm 09:51 PM

PHP中最佳的錯誤處理工具和庫包括:內建方法:set_error_handler()和error_get_last()第三方工具包:Whoops(調試和錯誤格式化)第三方服務:Sentry(錯誤報告和監控)第三方庫: PHP-error-handler(自訂錯誤日誌記錄和堆疊追蹤)和Monolog(錯誤日誌記錄處理器)

C++類別設計中如何進行錯誤處理與記錄? C++類別設計中如何進行錯誤處理與記錄? Jun 02, 2024 am 09:45 AM

C++類別設計中的錯誤處理和日誌記錄包括:異常處理:捕獲並處理異常,使用自訂異常類別提供特定錯誤訊息。錯誤碼:使用整數或枚舉表示錯誤條件,在回傳值中傳回。斷言:驗證預置和後置條件,不成立時引發異常。 C++函式庫日誌:使用std::cerr和std::clog進行基本日誌記錄。外部日誌庫:整合第三方庫以獲得高級功能,如等級過濾和日誌檔案旋轉。自訂日誌類:建立自己的日誌類,抽象底層機制,提供通用介面記錄不同等級資訊。

golang函數錯誤處理中的非同步處理 golang函數錯誤處理中的非同步處理 May 03, 2024 pm 03:06 PM

在Go函數中,非同步錯誤處理透過使用error通道,非同步地從goroutine傳遞錯誤。具體步驟如下:建立一個error頻道。啟動一個goroutine來執行操作並非同步發送錯誤。使用select語句從通道接收錯誤。非同步處理錯誤,例如列印或記錄錯誤訊息。此方法可以提高並發程式碼的效能和可擴展性,因為錯誤處理不會阻塞呼叫線程,並且可以取消執行。

Go 函數單元測試的錯誤處理策略 Go 函數單元測試的錯誤處理策略 May 02, 2024 am 11:21 AM

在Go函數單元測試中,錯誤處理有兩種主要策略:1.將錯誤表示為error類型的具體值,用於斷言預期值;2.使用通道向測試函數傳遞錯誤,適用於測試並發程式碼。實戰案例中,使用錯誤值策略確保函數對負數輸入回傳0。

如何使用 Golang 的錯誤包裝器? 如何使用 Golang 的錯誤包裝器? Jun 03, 2024 pm 04:08 PM

在Golang中,錯誤包裝器允許你在原始錯誤上追加上下文訊息,從而創建新錯誤。這可用於統一不同程式庫或元件拋出的錯誤類型,簡化偵錯和錯誤處理。步驟如下:使用errors.Wrap函數將原有錯誤包裝成新錯誤。新錯誤包含原始錯誤的上下文資訊。使用fmt.Printf輸出包裝後的錯誤,提供更多上下文和可操作性。在處理不同類型的錯誤時,使用errors.Wrap函數統一錯誤類型。

如何在golang函數中優雅地處理錯誤 如何在golang函數中優雅地處理錯誤 May 01, 2024 pm 10:12 PM

Go中優雅地處理錯誤有兩種方法:defer語句用於在函數傳回前執行程式碼,通常用於釋放資源或記錄錯誤。 recover語句用於捕獲函數中的panic,並允許程式以更優雅的方式處理錯誤,而不是崩潰。

See all articles