如何在多种方法中很好地使用try-catch
本文关键字:很好 try-catch 方法 | 更新日期: 2023-09-27 18:01:11
如果我的问题很愚蠢,很抱歉,但我有这样的代码:
public Object1 Method1(Object2 parameter)
{
try
{
return this.linkToMyServer.Method1(parameter);
}
catch (Exception e)
{
this.Logger(e);
}
return null;
}
public Object3 Method2(Object4 parameter)
{
try
{
return this.linkToMyServer.Method2(parameter);
}
catch (Exception e)
{
this.Logger(e);
}
return null;
}
/* ... */
public ObjectXX Method50(ObjectXY parameter)
{
try
{
return this.linkToMyServer.Method50(parameter);
}
catch (Exception e)
{
this.Logger(e);
}
return null;
}
我想你看到了模式。有没有一种很好的方法,只有一个try-catch,并在这个try-catch中传递一个泛型方法?
我本能地会使用委托,但委托必须有相同的签名权?
提前谢谢。
谨致问候。
每当您看到这样的代码时,您都可以应用Template Method Pattern。
可能是这样的:
private TResult ExecuteWithExceptionHandling<TParam, TResult>(TParam parameter, Func<TParam, TResult> func)
{
try
{
return func(parameter);
}
catch (Exception e)
{
this.Logger(e);
}
return default(TResult);
}
public Object1 Method1(Object2 parameter)
{
return ExecuteWithExceptionHandling(parameter, linkToMyServer.Method1);
}
public Object3 Method2(Object4 parameter)
{
return ExecuteWithExceptionHandling(parameter, linkToMyServer.Method2);
}
等等…
这可能对您有用。
public object BaseMethod(object[] userParameters,String FunctionName)
{
try
{
Type thisType = this.GetType();
MethodInfo theMethod = thisType.GetMethod(FunctionName);
object returnObj;
returnObj = theMethod.Invoke(this, userParameters);
return returnObj;
}
catch (Exception e)
{
this.Logger(e.InnerException);
}
}
在chocolatey
开源git中可以找到这样一个集中处理的例子。
集中化使用两个静态公共方法FaultTolerance.try_catch_with_logging_exception
进行——例如,该函数的用户需要编写以下内容:
巧克力包装服务.cs#L1073
有两个功能可以处理这种呼叫-
-
带
Func
参数 -
带
Action
参数
函数的其他参数由您决定是否要使用它们——一旦发生异常,它们可以调整或记录特定的错误消息。
(所有链接都提供了git历史中的绝对点,因此将来不会断开(。