如何覆盖或创建一个新的try / catch / finally块.net c#

时间:2017-10-12 20:44:10

标签: c# .net try-catch overwrite

我想覆盖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

2 个答案:

答案 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派生)。