可重复使用的Try/Catch块
本文关键字:Try Catch | 更新日期: 2023-09-27 18:27:38
我写了下面的方法,认为它可以让我传入一个方法调用,将其封装在try-catch中。我试图避免在整个应用程序中使用相同的try/catch锅炉板编码。我已经有20多个电话了,到我们结束的时候,会有数百个电话。
protected T CallRepository<T>(T repositoryMethod)
{
try
{
return repositoryMethod;
}
catch (Exception ex)
{
logger.Error(ex);
throw new DatabaseException();
}
}
调用方法看起来像:
var results = CallRepository<VisitLogDTO>(visitLogRepository.AddVisit(visitLogDTO));
起初我没有意识到这并没有像预期的那样奏效。正在发生的情况是,结果被封装在try/catch中,而不是对方法的调用中。如果我从visitLogRepository中得到数据库错误或任何错误,那么我会得到原始错误,而不是新的DatabaseExeception。
如有任何帮助,我们将不胜感激。
您需要传入Func<T>
,而不是T
:
protected T CallRepository<T>(Func<T> repositoryMethod)
{
try
{
return repositoryMethod();
}
catch (Exception ex)
{
logger.Error(ex);
throw;
}
}
并像一样使用
var results = CallRepository(() => visitLogRepository.AddVisit(visitLogDTO));
我不确定,但AddVisit方法似乎是在您的CallRepository方法之外调用的。尝试使用Action Delegate作为方法参数,并在方法中调用该Delegate,以确保调用在Try-catch中完成。然后使用Lambda表达式将其称为:
private handleException(Action myAction)
{
try
{
myAction();
}
catch[...]
}
呼叫:
handleException( () => { int result = FunctionThatThrowsException(); } )
最佳Lumo