Yii框架官方指南系列46-專題:錯誤處理
Yii提供了一個完整的,基於PHP5異常處理的錯誤處理機制。當一個應用程式開始運行,進行使用者請求的處理的時候,會註冊handleError方法來處理PHP warnings和notices資訊;同時也註冊加handleException方法來處理未被捕獲的PHP異常。因此,如果在應用程式運作期間出現一個PHP warning/notice 或一個未捕獲的PHP異常,錯誤處理器就會接過控制權來運作必要的處理機制。
提示: 錯誤處理器的註冊是在應用中的constructor方法中進行的,使用了PHP函數set_exception_handler 和set_error_handler。 如果你不想讓Yii來處理錯誤和異常,你可以在入口文件中定義
YII_ENABLE_ERROR_HANDLER
和YII_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會搜尋適當的視圖來顯示錯誤訊息,搜尋的順序如下:
WebRoot/themes/ThemeName/views/system
: 在目前主題視圖下的system
。WebRoot/protected/views/system
: 在套用的預設視圖的system
目錄中。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)!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

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

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

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

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

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

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