Enterprise Library – Exception Handling Application Block 學習手冊(最新版)Part 1
來源:互聯網
上載者:User
本文示範Enterprise Library – Exception Handling Application Block 異常管理模組的使用,如何將異常日誌記錄添加到應用程式中,以及如何使用Replace Handler隱藏敏感資訊。本文由http://blog.entlib.com 開源ASP.NET部落格平台小組根據EntLib HOL手冊編譯提供,歡迎交流。
練習一:記錄異常日誌1. 首先開啟\Enterprise Library 4.1 HOL\CS\Exception Handling\exercises\ex01\begin 目錄下的Puzzler.sln 專案檔。該應用程式執行2個功能:檢查單詞的拼字;根據字元列表,使用字典產生單字清單。 運行應用程式,介面如下所示。在單詞文本輸入框,輸入 ab123,然後點擊 Add Word 按鈕,將拋出一個未捕獲異常。 下面實現如何使用Exception Handling Application Block,進行異常管理。 2. 選擇PuzzlerUI 項目,添加如下dll 的引用。Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.dll 3. 開啟Puzzler.cs 代碼檔案,添加對ExcepitonHandling 命名空間的引用。using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling; 找到btnAddWord_Click 方法,添加try/catch 代碼塊,如下所示: private void btnAddWord_Click(object sender, System.EventArgs e) { try { // TODO: Handle exceptions PuzzlerService.Dictionary.AddWord(txtWordToCheck.Text); errorProvider1.SetError(txtWordToCheck, ""); } catch (Exception ex) { bool rethrow = ExceptionPolicy.HandleException(ex, "UI Policy"); if (rethrow) throw; MessageBox.Show(string.Format( "Failed to add word {0}, please contact support.", txtWordToCheck.Text)); } } 4. 為 PuzzlerUI 項目添加app.config設定檔,並使用EntLib附帶的設定檔編輯器開啟設定檔。然後,添加 Exception Handling Application Block 的配置,如所示。
接下來,添加新的Exception Policy,如所示。
設定Exception Policy的Name屬性為 UI Policy,該Policy的名稱需要和前面的代碼中保持一致。bool rethrow = ExceptionPolicy.HandleException(ex, "UI Policy"); 選擇UI Policy 節點,添加新的Exception Type,如所示。
在彈出的Type Selector對話方塊中,選擇System.Exception類型,如所示。
這個filter設定哪一類的Exception由異常處理代碼來負責處理,將處理所有繼承自System.Exception 類型的異常。另外,設定System.Exception類型的PostHandlingAction屬性為None,該屬性值None表示所有的異常將在異常處理代碼內部處理,調用方(caller)不需要在catch代碼塊中重新拋出異常。下面進一步選擇Exception Handling Application Block | UI Policy | Exception 節點,並選擇 New | Logging Handler 功能表項目,如所示。這一步操作將自動添加Logging Application Block到設定檔中,你可以觀察一下app.config 設定檔的變化。
選擇 Exception Handling Application Block | UI Policy | Exception | Logging Handler 節點,設定如下屬性:FormatterType = TextExceptionFormatterLogCategory = General
上述配置操作完成後,記得要儲存設定檔。 5. 設定PuzzlerUI 項目添加對如下dll引用。Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.dll 因為Enterprise Library 的一個目標是保持Application Blocks之間相互低耦合,因此Exception Handling Application Block也可以不必使用Logging Application Block(例如,建立自己的異常管理Handler)。如果你使用兩個application blocks,你需要引用上述的dll, Exception Handler來通過logging application block 來記錄異常日誌(預設安裝情況下,該dll在如下目錄C:\Program Files\Microsoft Enterprise Library 4.1 - October 2008\Bin)。 6. 再次運行應用程式重複前面的步驟,在單詞文本輸入框,輸入abc123,然後點擊 Add Word 按鈕,將彈出一個對話方塊 – Failed to add word abc123, please contact support。
檢查windows的事件記錄(Event Log),查看Application 日誌,發現日誌資訊已經記錄了。
為了在應用程式中給所有的代碼添加try/catch,你可以考慮添加一個全域的Exception Handler。有2個events可以用來監聽未捕獲異常(unhandled exception):(1)當執行Application.Run 方法的線程發生未捕獲異常時,觸發Application.ThreadException事件。(2)如果handler拋出異常,或者不在UI線程中發生異常,將觸發AppDomain.UnhandledException事件。 7. 更新代碼(1)刪除之前btnAddWord_Click方法中添加的代碼,如下所示: private void btnAddWord_Click(object sender, System.EventArgs e) { PuzzlerService.Dictionary.AddWord(txtWordToCheck.Text); errorProvider1.SetError(txtWordToCheck, ""); } (2)開啟Startup.cs代碼檔案,添加命名空間的引用。using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling; 同時,在Startup類中添加如下方法來處理異常。 public static void HandleException(Exception ex, string policy) { Boolean rethrow = false; try { rethrow = ExceptionPolicy.HandleException(ex, policy); } catch (Exception innerEx) { string errorMsg = "An unexpected exception occured while " + "calling HandleException with policy '" + policy + "'. "; errorMsg += Environment.NewLine + innerEx.ToString(); MessageBox.Show(errorMsg, "Application Error", MessageBoxButtons.OK, MessageBoxIcon.Stop); throw ex; } if (rethrow) { // WARNING: This will truncate the stack of the exception throw ex; } else { MessageBox.Show("An unhandled exception occurred and has " + "been logged. Please contact support."); } } 上述方法使用Exception Handling Application Block,如果Exception Handling Application Block自身發生問題(如遺漏配置項),也將顯示有效資訊。 繼續添加如下的方法作為應用程式的ThreadException事件的event handler: static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) { HandleException(e.Exception, "UI Policy"); } 上述方法使用前面定義過的UI Policy。在隨後的練習中,將定製這一Policy,允許忽略某些異常,並關閉應用程式。 下面繼續添加AppDomain的UnhandledException 事件的Event Handler: static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { if (e.ExceptionObject is System.Exception) { HandleException((System.Exception)e.ExceptionObject, "Unhandled Policy"); } }上述代碼使用了一個新的policy(Unhandled Policy),下一節將建立。Unhandled Policy 總是僅記錄異常,並不重拋異常。 最後,在Main方法中,通過如下代碼串連event handler和事件: static void Main() {
Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); Puzzler f = new Puzzler(); Application.Run(f); } 再次運行應用程式,重複前面的測試步驟,檢查彈出的訊息對話方塊和事件記錄中的異常記錄,確認完成了上述所有步驟,且應用程式工作和預期一致。 http://blog.entlib.com 開源ASP.NET部落格平台小組,歡迎你繼續方法下一節內容:Exception Handling application block – 異常管理原則。
參考文檔:Exception Handling Application Block Hands-On Labs for Enterprise Library