可重复使用的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。

如有任何帮助,我们将不胜感激。

可重复使用的Try/Catch块

您需要传入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