如何避免重复的try catch块?

本文关键字:catch try 何避免 | 更新日期: 2023-09-27 18:08:31

我有几个方法,看起来像这样:

public void foo()
{
   try 
   {
      doSomething();
   }
   catch(Exception e)
   {
      Log.Error(e);
   }
 }

我可以把代码改成这样吗?

[LogException()]
public void foo()
{   
   doSomething();
}

如何实现这个自定义属性?这样做的利弊是什么?

,编辑1 ------------

我可以自己实现它吗,我的意思是只写一个类,还是我需要使用postsharp或其他解决方案?

如何避免重复的try catch块?

你可以使用委托和lambda:

private void ExecuteWithLogging(Action action) {
    try {
        action();
    } catch (Exception e) {
        Log.Error(e);
    }
}
public void fooSimple() {
    ExecuteWithLogging(doSomething);
}
public void fooParameter(int myParameter) {
    ExecuteWithLogging(() => doSomethingElse(myParameter));
}
public void fooComplex(int myParameter) {
    ExecuteWithLogging(() => {
        doSomething();
        doSomethingElse(myParameter);
    });
}

实际上,您可以将ExecuteWithLogging重命名为类似ExecuteWebserviceMethod的东西,并添加其他常用的东西,例如检查凭据,打开和关闭数据库连接等

您可以尝试使用:PostSharp

或者试试谷歌'AOP' - '面向方面编程'。web上还有更多类似的技术

既然你提到你正在使用WCF,你可以实现IErrorHandler接口,所有的异常将被路由到你的方法,你可以记录他们。

  • http://www.extremeexperts.com/Net/Articles/ExceptionHandlingInWCF.aspx
  • http://codeifollow.blogspot.com/2010/02/wcf-exception-handling.html

如果您不想使用AOP方法,我以前的雇主之一在跨一组类的常见异常处理中使用的方法是使用具有类似于以下方法的基类

    protected TResult DoWrapped<TResult>(Func<TResult> action)
    {
        try
        {
            return action();
        }
        catch (Exception)
        {
            // Do something
            throw;
        }
    }

方法看起来像。

    public object AMethod(object param)
    {
        return DoWrapped(() =>
                      {
                          // Do stuff
                          object result = param;
                          return result;
                      });
    }

记不清了,有一段时间了。与此类似。