C# 许多方法使用相同的catch代码

C# 许多方法使用相同的catch代码,c#,.net,C#,.net,我有几个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

我有几个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
   }
}

有什么功能性的解决方案吗?注意,我不接受异常并使用
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;
    }
}
void Main()
{
var result=WrapFunctionCallWithReturn(()=>DoSomething(5));
var differentResult=WrapFunctionCallWithReturn(()=>DoSomethingDifferent(“tyto”,4));
}
公共int-DoSomething(int-v){返回0;}
公共字符串DoSomethingDifferent(字符串v,int val){返回“tyto”;}
public T WrapFunctionCallWithReturn(Func函数)
{
尝试
{
返回函数();
}
捕获(例外e)
{
//一组对所有函数都相同的逻辑
投掷;
}
}

这是乔尔·埃瑟顿的评论,解释为答案。请注意,这不是最好的解决方案(请参阅伊利亚·伊万诺夫的答案,以获得更好的解决方案)。
但这很简单,如果我没看错你的问题,这正是你想要的:

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);
   }
}

你能展示你的代码吗?为什么不尝试/捕获每一个并将异常发送到一个普通的静态函数呢?例如,请使用下面的代码:代码就像向函数添加属性一样简单@JoelEtherton我该怎么做,你有例子吗?你为什么不让你的异常冒泡出来,并由全局异常处理程序处理(记录)呢?谢谢!你的代码很有用!我确实遇到了一个问题,如果所有函数(WrapFunctionCallWithReturn除外)都使用了ref参数,就会导致一个错误:“不能在匿名方法中使用ref或out参数…”。我们解决了这个问题,先做了一个临时的,然后在通话结束后重新分配;有没有一种方法可以将此解决方案与ref或out参数以及async一起使用?您更喜欢哪一种:
var result=wait WrapFunctionCallWithReturn(()=>DoSomething(5))
var result=WrapFunctionCallWithReturn(()=>wait DoSomething(5))我明白了:
var result=wait WrapFunctionCallWithReturn(()=>DoSomething(5))是必需的-等待必须在尝试捕获内节省了大量时间!完全不相关,但是:作为占位符字符串,“tyto”对您有任何价值吗?还是它只是随机字母?(这是说‘谢谢你的回答’的借口!顺便说一句)