4

我有几个 C# 方法,我想将它们包装在一个 try-catch 块中。每个函数都有相同的 catch 逻辑。有没有一种优雅的方法可以为这些函数中的每一个添加一个装饰器,以便它们都用相同的 try/catch 块包装?我不想将 try/catch 块添加到所有这些函数中。

例子:

public void Function1(){
   try {
     do something
   }catch(Exception e) {
      //a BUNCH of logic that is the same for all functions
   }
}

public void Function2() {
   try {
     do something different
   }catch(Exception e) {
      //a BUNCH of logic that is the same for all functions
   }
}
4

2 回答 2

14

那么对此的一些功能解决方案呢?请注意,我不会吞下异常并使用throw;语句,这将重新引发异常并保持其原始堆栈跟踪。不要默默地吞下异常——这被认为是一种非常糟糕的做法,调试代码会变得很糟糕。

void Main()
{
    WrapFunctionCall( () => DoSomething(5));
    WrapFunctionCall( () => DoSomethingDifferent("tyto", 4));
}

public void DoSomething(int v){ /* logic */}

public void DoSomethingDifferent(string v, int val){ /* another logic */}

public void WrapFunctionCall(Action function) 
{
    try
    {
        function();
    }
    catch(Exception e)
    {
         //a BUNCH of logic that is the same for all functions
         throw;
    }
}

如果你需要返回一些值,WrapFunctionCall方法的签名会改变

void Main()
{
    var result = WrapFunctionCallWithReturn( () => DoSomething(5));
    var differentResult = WrapFunctionCallWithReturn( () => DoSomethingDifferent("tyto", 4));
}

public int DoSomething(int v){ return 0; }

public string DoSomethingDifferent(string v, int val){ return "tyto"; }

public T WrapFunctionCallWithReturn<T>(Func<T> function) 
{
    try
    {
        return function();
    }
    catch(Exception e)
    {
        //a BUNCH of logic that is the same for all functions
        throw;
    }
}
于 2013-03-28T14:45:18.263 回答
2

这是乔尔·埃瑟顿(Joel Etherton)的评论,被解释为答案。请注意,这不是最佳解决方案(请参阅 Ilya Ivanov 的答案以获得更好的解决方案)。
但这很简单,如果我正确阅读了您的问题,那正是您所要求的:

void errorHandling(Exception e)
{
  // Your BUNCH of logic
}

public void Function1(){
   try {
     do something
   }catch(Exception e) {
      errorHandling(e);
   }
}

public void Function2() {
   try {
     do something different
   }catch(Exception e) {
      errorHandling(e);
   }
}
于 2013-03-28T15:08:51.997 回答