2

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

4

3 回答 3

3

PostSharp这样的AOP框架可以在这里为您提供帮助。有一篇关于这里的博客文章。OnExceptionAspect

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

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


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

于 2012-06-08T11:32:53.470 回答
3
  • 不要将所有内容都包装在try-catch. try-catch在您通常会在代码中没有错误的情况下看到异常的地方使用,例如 IO 操作。如果你包装所有东西,那实际上可能会使测试和调试变得更加困难,从而导致代码质量降低。让错误冒出并在开发早期捕获它们。
  • 编写一个处理程序方法来执行日志记录和您想要做的所有其他常见事情,并简单地在块try-catch中使用该方法。catch
  • try-catch通过订阅AppDomain.Current.UnhandledException事件,使用全局异常处理程序记录块未处理的异常。
于 2012-06-08T11:43:11.213 回答
0

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

于 2012-06-08T11:35:01.927 回答