【问题标题】:How can I avoid duplicated try catch blocks如何避免重复的 try catch 块
【发布时间】:2011-09-12 06:50:46
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 您必须实现基于属性的自定义拦截器。搜索这个。
  • 我希望你的意思是catch(Exception e) { Log.Error(e); throw; }
  • @Henk 我的意思是没有投掷; (我在wcf服务有几个方法,不能把异常向上层抛出,会压垮我的程序)你有什么建议?
  • 您似乎在要求 PostSharp 网站链接。
  • @Delash,只处理你知道的异常。您当前的代码正在崩溃,它只是没有告诉客户。

标签: c# attributes try-catch


【解决方案1】:

您可以使用委托和 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 并添加其他常用的东西,例如检查凭据、打开和关闭数据库连接等。

【讨论】:

    【解决方案2】:

    您可以尝试使用:PostSharp

    或尝试谷歌“AOP”-“面向方面的编程”。网络上有更多类似的技术。

    【讨论】:

      【解决方案3】:

      由于您提到您正在使用 WCF,您可以实现 IErrorHandler 接口,所有异常都将被路由到您可以记录它们的方法。

      【讨论】:

        【解决方案4】:

        如果您不想使用 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;
                              });
            }
        

        具体记不清了,有一段时间了。不过和这个差不多。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-29
          • 2018-06-21
          • 2011-12-09
          • 1970-01-01
          • 2022-11-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多