我需要一种方法将所有方法包装在尝试捕获中

本文关键字:包装 有方法 方法 一种 | 更新日期: 2023-09-27 18:36:30

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

我需要一种方法将所有方法包装在尝试捕获中

  • 不要把所有东西都包装在try-catch里. 在某些地方使用try-catch通常,您可能会看到异常,而代码中没有 bug,例如 IO 操作。如果将所有内容都包装起来,实际上可能会使测试和调试更加困难,从而导致代码质量降低。让 bug 冒泡并在开发早期捕获它们。
  • 编写一个处理程序方法,用于执行日志记录和要在try-catch中执行的所有其他常见操作,并在catch块中简单地使用该方法。
  • 使用全局异常处理程序通过订阅 AppDomain.Current.UnhandledException 事件来记录try-catch块未处理的异常。

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

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

就个人而言,我永远不会真正使用它,因为我只尝试/抓住我可以处理的事情,并且在整个应用程序中从不需要按方法记录之类的东西。如果你处理不了它,就不要抓住它。


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

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