我需要一种方法来将所有方法包装在try catch中

时间:2012-06-08 11:30:27

标签: c# methods delegates lambda try-catch

如果有一种方法可以将我的所有方法都包装在try catch中,而无需在每个方法中编写try catch。

目前我们正在使用下面提到的方法:

public TValue ErrorHandler<TValue>(Func<TValue> action)
    {
        try
        {
            return (TValue)action();
        }
        catch (Exception ex)
        {
            //Handle Exception and Log it..........
            return default(TValue);
        }
    }

    public void ErrorHandler(Action action)
    {
        try
        {
            action();
        }
        catch (Exception ex)
        {
            //Handle Exception and Log it..........
        }
    }

,用作:

public void ClearControls()
    {
        this.ErrorHandler(() =>
        {
               //................................
        });
    } 

由于它使用了Lambda,如果在调试时编辑代码,它会强制再次运行应用程序。

请让我知道任何其他可能的解决方案,我可以在所有方法中实现Try Catch并毫不费力地调试我的代码。

3 个答案:

答案 0 :(得分:3)

AOPPostSharp框架可以为您提供帮助。有一篇关于OnExceptionAspect here

的博客文章

基本上是最终的结果,而不是将try-catch放入你的方法中,你用一个属性(或者在这种情况下是方面)来装饰方法。

就我个人而言,我从来没有真正使用过这个,因为我只会尝试/捕捉我可以处理的事情,并且从不需要像整个应用程序中的每个方法记录一样的东西。如果你无法处理它,请不要抓住它。

<小时/> 更新:根据您的评论,PostSharp的替代方案是Castle DynamicProxy,这是免费的。关于PostSharp许可证,您应该能够从免费版本获得所需的行为,免费版本涵盖方法级别aspest详细here

答案 1 :(得分:3)

  • 请勿在{{1​​}}中包含所有内容。在地方使用try-catch 您通常可以在不出现代码错误的情况下看到异常,例如IO操作。如果你包装了所有内容,那可能会使测试和调试更加困难,导致代码质量下降。让臭虫冒出来,及早发现它们。
  • 编写一个处理程序方法,用于执行日志记录以及您希望在try-catch中执行的所有其他常见操作,并在try-catch块中使用该方法。
  • 使用全局异常处理程序通过订阅AppDomain.Current.UnhandledException事件来记录catch块未处理的异常。

答案 2 :(得分:0)

最简单的解决方案是捕获调用者中的错误,或者更进一步,通常是您的Program.cs或global.asax.cs的线程入口点。