Как обрабатывать исключения, которые глубоко в коде? - PullRequest
3 голосов
/ 07 сентября 2011

У меня есть веб-сервис, который возвращает xml. Проблема заключается в методах, которые выполняются «глубоко» в коде, где простой возврат не остановит выполнение программы.

Что происходит, я устанавливаю свое сообщение об ошибке xml в операторе catch, но код будет продолжать выполняться через остальную часть внешнего метода и перезаписывает мой ответ об ошибке xml.

Есть ли шаблон проектирования или лучшие практики, чтобы обойти это?

      Main Program Block                    SomeClass

         execute someMethod()     ---->     public someMethod()
                                            {
                                                    -----> private method()// try / catch error occurred (send back an xml error response)

                                                    // code execution continues and does some stuff and generates an xml response
                                                    <request>
                                                    <success>true</success>
                                                    </request>
                                            }

Ответы [ 5 ]

4 голосов
/ 07 сентября 2011
catch (Exception)
{
    // Set errors here
    throw;
}

Это отбросит исключение.Это то, что вы ищете?

3 голосов
/ 07 сентября 2011

Вам нужно подумать о настройке границ исключений в вашей архитектуре.

В прошлом я использовал Блок обработки исключений Microsoft , чтобы успешно это делать.

Этопозволит вам настроить различные политики для обработки и распространения исключений, как показано на диаграмме ниже;

Это поможет вам справиться с сценариями , такими как;

  • Ведение журнала
  • Замена
  • Упаковка
  • Распространение
  • Удобные для пользователя сообщения

enter image description here

Это стоит посмотреть в зависимости от того, как далеко вы хотите пройти обработку исключений.

3 голосов
/ 07 сентября 2011

Вы можете повторно выбросить исключение. Например:

    private static string errorMessage;
    static void Main(string[] args)
    {
        try
        {
            Test1();
        }
        catch (Exception ex) 
        {
            Console.WriteLine("Something went wrong deep in the bowels of this application! " + errorMessage );
        }

    }

    static void Test1()
    {
        try
        {
            Test2(1);
            Test2(0);   
        }
        catch (Exception ex)
        {
            errorMessage = ex.Message;
            throw;
        }
    }

    static string Test2(int x)
    {
        if (x==0) throw new ArgumentException("X is 0!");
        return x.ToString();
    }

Дополнительный совет: при повторном вызове исключения используйте throw;, а не throw ex;, чтобы сохранить трассировку стека. См. this для получения дополнительной информации по этому вопросу.

1 голос
/ 07 сентября 2011

Как правило, лучше ловить исключения как можно дальше по цепочке.Таким образом, основная обязанность метода обслуживания - перехватывать различные типы исключений и определять соответствующий ответ.Углубленный код не должен просто «проглотить» исключение, если он действительно не знает, как его обработать и двигаться дальше.

Если вы хотите сделать это таким образом, определенные исключения могут сообщить коду верхнего уровня, что он долженчтобы использовать конкретную информацию для ответа, вы можете создать собственный тип исключения со свойствами, которые может проверять код перехвата исключений в методе службы.

// In your deep down code
catch (Exception e)
{
    throw new ReturnErrorMessageException("The user should see this message.", e);
}
// In your service method
catch (SendErrorMessageException e)
{
    Response.Message = e.UserFacingErrorMessage;
    _logger.LogError("An error occurred in the web service...", e);
}
0 голосов
/ 07 сентября 2011

Вероятно, лучшим решением для того, что вы ищете, является использование Аспектно-ориентированного программирования (AOP) и создание Аспектов обработки исключений, которые перехватывают и обрабатывают все исключения, затем вы проверяете исключения на уровне обслуживания.

Преимущество этого в том, что он удаляет ловушку из вашего кода и позволяет обрабатывать исключения модульным способом.

Некоторые решения AOP для .NET включают Castle Windsor, Spring.NET и Microsoft Unity.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...