可重复使用的Try / Catch Block

时间:2014-10-23 14:17:08

标签: c# asp.net

我编写了以下方法,认为它允许我传入一个方法调用以包装在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。

非常感谢任何帮助。

2 个答案:

答案 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