【问题标题】:I need a way to wrap all my methods inside try catch我需要一种方法来将我所有的方法都包装在 try catch 中
【发布时间】:2012-06-08 11:30:26
【问题描述】:

如果有一种方法可以将我的所有方法包装在 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 并轻松调试我的代码。

【问题讨论】:

  • 我希望你不是真的指所有的方法。如果您对所有方法执行此操作,则基本上将异常处理作为一种机制从您的应用程序中删除。你不想那样做。

标签: c# methods delegates lambda try-catch


【解决方案1】:
  • 不要将所有内容都包含在try-catch 中。在某些地方使用try-catch 通常情况下,您可能会在代码中看到异常而没有错误,例如 IO 操作。如果你包装所有东西,那实际上可能会使测试和调试变得更加困难,从而导致代码质量降低。让错误冒出并在开发早期发现它们。
  • try-catch 中编写一个处理程序方法来执行日志记录和您想要执行的所有其他常见操作,然后在catch 块中使用该方法。
  • 通过订阅AppDomain.Current.UnhandledException 事件,使用全局异常处理程序记录try-catch 块未处理的异常。

【讨论】:

    【解决方案2】:

    AOP 框架,例如 PostSharp 可以在这里为您提供帮助。有一篇关于OnExceptionAspecthere的博文。

    基本上是最终结果,而不是将 try-catch 放入方法中,而是使用属性(或本例中的方面)装饰方法。

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


    更新:根据您的 cmets,PostSharp 的替代品是 Castle DynamicProxy,它是免费的。关于 PostSharp 许可证,您应该能够从免费版本中获得所需的行为,该版本涵盖了方法级别的 aspest,详见 here

    【讨论】:

    • 亚当,我尝试了你的方式,我在一个链接 (codeproject.com/Articles/8436/…) 中找到了我想要做的事情。但是这种方法的问题是我们需要从ContextBoundObject继承所有的类。但是 System.Windows.Forms.Form 不能从 ContextBoundObject 继承。您是否有任何类似的其他方式可以帮助实现我的目的。我也不能选择 PostSharp,因为这需要许可证,我不能这样做,因为它超出了我的预算。如果您有,请提出任何其他替代方案。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 2014-09-17
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      相关资源
      最近更新 更多