Я написал следующий метод, думая, что он позволит мне передать вызов метода, который будет заключен в ловушку попытки. Я стараюсь избегать использования одинаковых кодов 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.

Любая помощь будет принята с благодарностью.

1
CubeRoot 23 Окт 2014 в 18:17

2 ответа

Лучший ответ

Вам нужно передать 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));
5
Eren Ersönmez 23 Окт 2014 в 14:24

Я не уверен, но кажется, что метод AddVisit вызывается вне вашего метода CallRepository. Попробуйте использовать делегат действия в качестве параметра метода и вызовите этот делегат в методе, чтобы убедиться, что вызов выполняется в пределах try catch. Затем используйте лямбда-выражение, чтобы вызвать его:

private handleException(Action myAction)
{
    try
    {
        myAction();
    }
    catch[...]
}

Вызов:

 handleException( () => { int result = FunctionThatThrowsException(); } )

Лучший Lumo

0
Lumo 29 Окт 2014 в 11:15