异常处理(Exception Handling)是所有系统的最基本的基础操作之一,其它的比如日志(Logging)、审核(Auditing)、缓存(Caching)、事务处理(Transaction)等;
今天,来把异常处理引入到我们在《MVP之V和P的交互》中Calculator的实例中,简单的实现AOP。实例运行如图:
那么,开始我们开简单的介绍下Enterprise Library EHAB(Exception Handling Application Block)提供了一种基于策略(Policy)的异常处理方式。具体的可以参考这里。
如何配置
具体的配置如下:
<configuration> <configSections> <section name="exceptionHandling" type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Configuration.ExceptionHandlingSettings, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" /> </configSections>
1 <exceptionHandling> 2 <exceptionPolicies> 3 <add name="UIExceptionPolicy"> 4 <exceptionTypes> 5 <add name="All Exceptions" type="System.Exception, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 6 postHandlingAction="None"> 7 <exceptionHandlers> 8 <add type="Handwe.Demo.UnityInMVP.MessageBoxHandler, Handwe.Demo.UnityInMVP" 9 name="Custome Handler" /> 10 </exceptionHandlers> 11 </add> 12 </exceptionTypes> 13 </add> 14 </exceptionPolicies> 15 </exceptionHandling>
这些是可以通过配置工具来配置的;现在我们来说说具体的内容:
<exceptionPolicies> <add name="UIExceptionPolicy">
添加一个名为UIExceptionPolicy的异常策略;
1 <add name="All Exceptions" type="System.Exception, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 2 postHandlingAction="None">
配置要处理的异常类型,这里是所有异常;postHandlingAction="None"是无后续处理;
1 <exceptionHandlers> 2 <add type="Handwe.Demo.UnityInMVP.MessageBoxHandler, Handwe.Demo.UnityInMVP" 3 name="Custome Handler" />
exceptionHandlers添加的是一个我们自定义的处理程序,名为MessageBoxHandler,就是简单的一个弹出式消息框;
代码的实现
- 引用程序集
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling;
using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Configuration;
- 异常处理程序MessageBoxHandler
1 namespace Handwe.Demo.UnityInMVP 2 { 3 [ConfigurationElementType(typeof(CustomHandlerData))] 4 public class MessageBoxHandler : IExceptionHandler 5 { 6 public MessageBoxHandler(NameValueCollection igonre) 7 { 8 9 } 10 public Exception HandleException(Exception exception, Guid handlingInstanceId) 11 { 12 MessageBox.Show(exception.Message, "Application Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 13 return exception; 14 } 15 } 16 }
这里很简单也没有用到相应的参数配置;
try { this.OnCalculating(op1, op2); } catch (Exception ex) { if (ExceptionPolicy.HandleException(ex, "UIExceptionPolicy")) { throw; } }
修改并应用以上代码;指定异常处理策略;
小结
通过Entlib的EHAB,我们可以专注于具体的业务逻辑上,类似异常之类的非业务处理可以通过后期的配置来实现。