2017-10-12 40 views
-1

我想覆盖try/catch/finally块或创建一个新的myTry/myCatch/myFinally块,在内部有一个特定的“自动”行为。 例如,要记录一个异常,开发人员必须显式调用Log(ex)方法。 =>try{...}catch(Ex ex){ **Log(ex)**; doSomething(); throw; }如何覆盖或创建一个新的try/catch/finally块.net c#

但是如果开发者忘记调用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

你想要自动日志if并且只有当调用者忘记自己做了吗?只需添加日志记录和调用方的方法来抑制它。日志记录系统标志,类属性或函数的可选参数。编辑:如果这是一个实际问题,也应该使用日志记录系统。 Log4net或其他。这些问题已经解决了很多 – zzxyz

回答

0

一般来说,cross cutting concerns(验证,日志记录,授权,审计等)应被分解出来的应用程序的“正常”的一部分,而不是试图“超越尝试捕捉”。

有一个很好的关于Aspect-Oriented Programming : Aspect-Oriented Programming with the RealProxy Class的MSDN文章。

同样,您可以使用Interception具有相同的目标。在MSDN上有一篇关于interception with Unity的文章,但该功能在其他一些流行的DI容器上也可用。

某些应用程序框架还具有内置的扩展以解决交叉问题。例如,ASP.NET MVC具有filters,可以全局注册,然后使用.NET属性打开或关闭应用程序的特定部分。

0

我会用拦截器包装一个服务来实现服务调用的日志记录。它将提供一种获取异常的方法,而不管程序员如何编写catch代码。

示例是在我的服务层,我使用logginginterceptor绑定解析。

这个URL会给你一个充满不确定性的方向推动,但会让你抽象如何处理异常。

https://msdn.microsoft.com/en-us/library/dn178466(v=pandp.30).aspx

此外,可以从另一个代码层通过验证抛出该异常的对象。如果你(Throw New CustomException(“Error 121”)),你的try catch代码就会知道该怎么做,如果你使用了拦截,你可以处理所有类型的自定义异常(从System.Exception派生)

相关问题