我编写了以下方法,认为它允许我传入一个方法调用以包装在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。
非常感谢任何帮助。
答案 0 :(得分:5)
您需要传递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));
答案 1 :(得分:0)
我不确定,但似乎在CallRepository方法之外调用了AddVisit方法。 尝试使用Action Delegate作为Method Parameter并在Method中调用Delegate以确保在try catch中完成调用。 然后使用Lambda表达式来调用它:
private handleException(Action myAction)
{
try
{
myAction();
}
catch[...]
}
呼叫:
handleException( () => { int result = FunctionThatThrowsException(); } )
最佳LUMO