技术开发 频道

Enterprise Library 2.0:异常应用程序块(一)

第六步 加入异常记录程序集
选择项目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

 

 

 

 

 

 

 

 

0
相关文章