C# 许多方法使用相同的catch代码
我有几个C#方法,我想将它们包装在一个try-catch块中。每个函数对于catch都有相同的逻辑。有没有一种优雅的方法可以向这些函数中的每一个添加一个装饰器,以便它们都使用相同的try/catch块包装?我不想将try/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
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”对您有任何价值吗?还是它只是随机字母?(这是说‘谢谢你的回答’的借口!顺便说一句)