Enterprise Library 2.0 Hands On Lab 翻譯(7):異常應用程序塊(一)
練習1: 記錄異常信息
通過本練習,將會在一個沒有異常處理的應用程序中使用異常處理應用程序塊添加本地和全局的異常處理,并記錄到Windows事件日志中。
第一步
打開Puzzler.sln 項目,默認的安裝路徑應該為C:\Program Files\Microsoft Enterprise Library January 2006\labs\cs\Exception Handling\exercises\ex01,并編譯。
第二步 回顧應用程序
選擇Debug | Start Debugging菜單命令運行應用程序,當前應用程序并沒有出現異常信息。當嘗試增加一個帶有數字的單詞(在文本框中輸入“abc123”并單擊Add Word按鈕)到目錄中時,將會出現一個未處理的異常,調試將會中斷。
選擇Debug | Stop Debugging菜單命令退出應用程序并返回Visual Studio。
第三步 增加Try/Catch異常處理
1.選擇PuzzlerUI項目,并選擇Project | Add Reference …菜單命令,選擇Browse項并添加如下程序集。
Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.dll

默認的安裝位置為C:\Program Files\Microsoft Enterprise Library January 2006\bin。
2.在解決方案管理器中選擇Puzzler.cs文件,并選擇View | Code菜單命令,添加如下命名空間。
using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling;3.在btnAddWord_Click方法中添加如下代碼,在調用AddWord 和SetError時添加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));
}
}注意這里使用throw語句非常重要,而不能使用throw ex。如果使用throw ex將在重新拋出異常點對異常信息重新進行包裝,這樣達不到預期的效果。
第四步 企業庫配置工具
1.在項目PuzzlerUI中添加一個新的應用程序配置文件(App.config)。單擊PuzzlerUI項目,選擇Project| Add New Item…菜單命令,然后選擇Application configuration file模版,保留App.config名字。

2.使用Enterprise Library配置工具配置應用程序,可以通過開始菜單打開該配置工具,選擇所有程序| Microsoft patterns and practices | Enterprise Library | Enterprise Library Configuration,并打開App.config文件。或者直接在Visual Studio中使用該工具打開配置文件。
3.在解決方案管理器中選中App.config文件,在View菜單或者在右鍵菜單中選擇Open With…,將打開OpenWith對話框,單擊Add按鈕。

4.在Add Program對話框中,設置Program name指向EntLibConfig.exe文件,默認的路徑為C:\Program Files\Microsoft Enterprise Library January 2006\bin,設置Friendly name為Enterprise Library Configuration,單擊OK按鈕。

Visual Studio會把配置文件(App.config)作為一個命令行參數傳遞給EntLibConfig.exe。
5.在Open With對話框中,選中Enterprise Library Configuration并單擊OK按鈕。

第五步 配置應用程序以使用異常管理
1.右擊應用程序并選擇New | Exception Handling Application Block。

2.選中Exception Handling Application Block節點,選擇Action | New | Exception Policy菜單命令,設置Name屬性為UI Policy。

3.選中UI Policy節點,選擇Action | New | Exception Type菜單命令,將會打開Type Selector對話框,選擇System.Exception(默認)并單擊OK按鈕。

4.選中Exception節點,設置屬性PostHandlingAction為None。

這將會使所有的異常都會被異常處理代碼所處理。
5.選中Exception Handling Application Block | UI Policy | Exception節點,選擇Action | New | Logging Handler菜單命令。

注意通過這步操作之后將會自動包含日志應用程序塊到配置中來。
6.選擇Exception Handling Application Block | UI Policy | Exception | Logging Handler節點,并設置如下屬性。
FormatterType = TextExceptionFormatter
LogCategory = General

7.選擇菜單File | Save All保存應用程序的配置,并關閉Enterprise Library Configuration工具。
第六步 加入異常記錄程序集
選擇項目PuzzlerUI,選擇Project | Add Reference …菜單命令,在彈出的對話框中選中Browse項并加入如下程序集。

Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.dll
第七步 運行應用程序
1.選擇Debug | Start Without Debugging菜單命令運行應用程序。在Word to check文本框中輸入數字并單擊Add Word按鈕。將會彈出一個錯誤信息提示框,顯示的信息為“Failed to add word …, please contact support”。
2.打開Windows事件查看器,查看應用程序日志,異常信息已經被記錄。

3.關閉應用程序
第八步 添加全局異常處理
1.雖然可以在每一個事件處理的地方都加入try/catch程序塊來處理異常,但通常更好的方法是加入一個全局的異常處理不管任何時候發生異常都會被處理。
2.在解決方案管理器中選擇Puzzler.cs文件,選擇View | Code菜單命令。在方法btnAddWord_Click中移除前面添加的異常處理程序,使其變為如下的代碼。
private void btnAddWord_Click(object sender, System.EventArgs e)
{
PuzzlerService.Dictionary.AddWord(txtWordToCheck.Text);
errorProvider1.SetError(txtWordToCheck, "");
}3.在解決方案管理器中選擇Startup.cs文件,選擇View | Code菜單命令,添加如下的命名空間。
using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling;應用程序的入口點,這里提供了兩個事件可以用來處理異常信息。當一個未處理的異常發生在主工作線程上時Application.ThreadException事件被觸發,當異常發生在不同于UI的線程上時AppDomain.UnhandledException將會被觸發。
4.添加如下異常處理程序到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.");
}
}該方法用于異常處理程序塊,它用于當異常處理程序塊本身出現問題時(比如說配置錯誤)顯示錯誤信息。
5.添加如下代碼到應用程序的ThreadException事件中。
static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
HandleException(e.Exception, "UI Policy");
}該事件處理將使用UI Policy策略,在配置文件中定義的。
6.為AppDomain UnhandledException添加如下代碼。
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
if (e.ExceptionObject is System.Exception)
{
HandleException((System.Exception)e.ExceptionObject, "Unhandled Policy");
}
}該事件處理將使用一個新的名為Unhandled Policy的處理策略,在下一個練習中將會設置它,它只能被記錄而不允許重新被拋出。
7.把事件處理與事件之間連接起來,在Main方法中加入如下代碼。
static void Main()
{
// TODO: Handle unhandled exceptions
Application.ThreadException +=
new ThreadExceptionEventHandler(Application_ThreadException);
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Puzzler f = new Puzzler();
Application.Run(f);
}8.選擇Debug | Start Without Debugging菜單命令運行應用程序。在Word to check文本框中輸入數字并單擊Add Word按鈕。將會彈出一個錯誤提示信息“An unhandled exception occurred and has been logged. Please contact support.”,可以在事件日志中查看異常信息。
9.關閉應用程序和Visual Studio。
更多Enterprise Library的文章請參考《Enterprise Library系列文章》
Worktile,新一代簡單好用、體驗極致的團隊協同、項目管理工具,讓你和你的團隊隨時隨地一起工作。完全免費,現在就去了解一下吧。
https://worktile.com



浙公網安備 33010602011771號