我想覆盖try / catch / finally块或创建一个新的myTry / myCatch / myFinally块以在内部具有特定的“自动”行为。
例如,要记录异常,开发人员必须显式调用Log(ex)方法。 => try{...}catch(Ex ex){ **Log(ex)**; doSomething(); throw; }
但如果开发人员忘记调用Log(ex),则不会发生任何事情。
我想创建一个能够在其中执行某些操作的结构,例如模板模式。类似的东西:
MyTryWithAutomaticInternalLog {
doSomething();
}
MyCatch(Exception ex){
**//Internally this stores in someplace the exception**
doSomething2(ex);
throw;
}
MyFinally {
//internally this saves how much time took the execution for example.
doSomething3();
}
还有其他选择,例如:
1)创建一个类似的包装器方法
MyTryWithAutomaticInternalLog(()=>{ doSomething(); }, (ex)=>{ doSomethingOnError(); }, ()=>{ doSomethingInfinally(); });
并且在带有模板模式策略的MyTryWithAutomaticInternalLog内部管理流程,但同样,开发人员必须记住使用方法MyTryWithAutomaticInternalLog而不是非常标准的try / catch / finally。
2)避免在代码中使用try / catch并使用依赖注入模式管理异常。但我想避免它。
还有其他选择吗?如何覆盖try / catch / finally块?如果不是,如果您提供一些技术信息和链接,我将不胜感激,因为我搜索的没有太多运气。
TKX
答案 0 :(得分:0)
一般来说,cross cutting concerns(验证,记录,授权,审核等)应该从" normal"中排除。应用程序的一部分,而不是试图"覆盖try catch"。
有一篇关于Aspect-Oriented Programming : Aspect-Oriented Programming with the RealProxy Class的MSDN文章很好。
同样,您可以使用Interception目标相同。在MSDN上有一篇关于interception with Unity的文章,但在其他一些流行的DI容器上也可以使用此功能。
某些应用程序框架还具有针对交叉问题的内置扩展。例如,ASP.NET MVC具有filters,可以全局注册,然后使用.NET属性打开或关闭应用程序的特定部分。
答案 1 :(得分:0)
我将使用拦截器包装服务来实现服务调用的日志记录。无论程序员如何编写catch代码,它都将提供一种获取异常的方法。
示例在我的服务层中,我使用logginginterceptor绑定解析。
这个网址会给你一个充满不确定性的方向微调,但是会让你抽象出如何处理异常。
https://msdn.microsoft.com/en-us/library/dn178466(v=pandp.30).aspx
此外,您可以通过验证对象从另一层代码中抛出异常。如果您(抛出新的CustomException("错误121"),您的try catch代码将知道该怎么做。如果您使用拦截,您可以处理所有类型的自定义异常(从System.Exception派生)。