Enterprise Library - Exception Handling Application Block 学习手册(最新版)Part 1


Enterprise Library - Exception Handling Application Block 学习手册(最新版)Part 1
 
本文演示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 = TextExceptionFormatter
LogCategory = 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
 

 

发表 @ 2009年8月31日 21:57

打 印

评论

# re: Enterprise Library - Exception Handling Application Block 学习手册(最新版)Part 1

Left by wh at 2009/9/2 17:25
Gravatar
Exception Handling Application Block 记录日志的位置,我如果想新建一个该么样设置.就是错误日志不保存在,事件查看器的默认位置.

# re: Enterprise Library - Exception Handling Application Block 学习手册(最新版)Part 1

Left by entlibforum at 2009/9/2 19:33
Gravatar
你可以在Logging Application Block 中定义一个新的TraceListener,如文本文件的Trace Listener,或者自定义Trace Listener,就可以将日志记录到其他地方了,如数据库,或者发送Email等等。

你看看后面的Logging Application Block 学习手册就知道了。

# re: Enterprise Library - Exception Handling Application Block 学习手册(最新版)Part 1

Left by wh at 2009/9/3 14:27
Gravatar
谢谢你的回复.但我按你说的做了,但还是有问题.比如我用C#的EventLog.CreateEventSource()方法新建了一个叫Windows的日志文件.但我在Trace Listeners -- Formatted EventLog TraceListener 的Log选项中设置了为Windows.
运行后发现还是没有记录日志.最后我发现了一个问题.在事件查看器的每个日志中都有一个筛选器,如果在事件来源的下拉框中没有相应的事件源,日志还是不会进入你先前指定的日志中去的.后来我新建了一个和Log名称相同的项目(项目名也叫Windows),并指定写入到Winsows日志中就成功了.
就是还有一点想请教一下.在Logging Application Block 有没有方法能新建日志文件的方法.比如和EventLog.CreateEventSource()方法相类型的.谢谢.

# re: Enterprise Library - Exception Handling Application Block 学习手册(最新版)Part 1

Left by entlibforum at 2009/9/3 18:01
Gravatar
你使用具有Administrator 角色的用户运行范例程序,Logging Application Block会在第一次运行时自动创建Event Source。之后,就不需要使用Administrator 运行应用程序了。

你可以看看Logging Application Block 的学习文档,有这方面的介绍。

# re: Enterprise Library - Exception Handling Application Block 学习手册(最新版)Part 1

Left by lf at 2009/9/18 16:06
Gravatar
按照你的配置,问什么我的程序里bool rethrow = ExceptionPolicy.HandleException(ex, "UI Policy");这段程序报,未将对象引用或设置到实例

# re: Enterprise Library - Exception Handling Application Block 学习手册(最新版)Part 1

Left by entlibforum at 2009/9/19 10:51
Gravatar
估计你忘记了在配置文件中,设置 Exception Policy的Name属性为 UI Policy,该Policy的名称需要和前面的代码中保持一致。

# re: Enterprise Library - Exception Handling Application Block 学习手册(最新版)Part 1

Left by Fred at 2010/1/20 11:11
Gravatar
wpf 和EnterPrise Library冲突么,我建立了一个很简单的wpf程序,然后添加enterpri library的应用,发现会报错。

# re: Enterprise Library - Exception Handling Application Block 学习手册(最新版)Part 1

Left by Fred at 2010/1/20 15:17
Gravatar
原来要加dll就好了Microsoft.Practices.EnterpriseLibrary.Common

您的评论:



 (不显示)


 
 
 
Please add 1 and 8 and type the answer here:
    
 

评论预览窗口:

 
«九月»
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789