воскресенье, 18 декабря 2011 г.

Упрощаем обработку исключений

Я начинаю серию постов, посвященных разнообразным методам-расширениям, которые немного упрощают жизнь простого разработчика, выполняя рутинную работу. Сегодня я хочу рассказать о расширениях для класса Exception.

Я использую методы-расширения а не просто статические методы, по ряду причин. Во-первых – это довольно изящно выглядящая синтаксическая конструкция, а во-вторых (и, наверное, это самое важное) – методы-расширения выдаются в подсказке Intellisense.

Методы-расширения часто очень просты, делают очень простые операции и, по сути, восполняют недостатки исходных классов, которые проявляются при их практическом применении. Большое спасибо ребятам из Microsoft, что дают нам такую возможность!

Но хватит лирики, переходим к делу.

Вывод сообщения об ошибке

Очень часто нужно бывает просто вывести сообщение об ошибке, однако текста, которые выдает Exception.Message обычно бывает недостаточно. Приходится смотреть глубже и выдавать текст в т.ч. вложенных исключений. Именно для этого предназначены приведенные ниже методы:

   1: /// <summary>
   2: /// Получить рекурсивно все сообщения исключения
   3: /// </summary>
   4: public static string AllMessages(this Exception x)
   5: {
   6:     string result = x.Message;
   7:     if (x.InnerException != null)
   8:         result += "\r\n->" + x.InnerException.AllMessages();
   9:     return result;
  10: }
  11:  
  12: /// <summary>
  13: /// Получить рекурсивно для вложенных исключений все сообщения вместе со стеком
  14: /// </summary>
  15: public static string AllMessagesAndStack(this Exception x)
  16: {
  17:     string result = x.Message;
  18:     result += "\r\n" + x.StackTrace + "\r\n\r\n";
  19:  
  20:     if (x.InnerException != null)
  21:         result += x.InnerException.AllMessagesAndStack();
  22:  
  23:     return result;
  24: }

Найти первопричину


Иногда нужно узнать самое первое, самое глубоко вложенное исключение, которое стало первопричиной невозможности выполнить операцию. Это может быть, например, отсутствие доступа к какому-то файлу. Получить самое глубоко вложенное исключение одной строкой поможет простой метод MostInner:



   1: /// <summary>
   2: /// возвращает наиболее вложенное исключение в цепочке
   3: /// </summary>
   4: public static Exception MostInner(this Exception x)
   5: {
   6:     while (x.InnerException != null)
   7:         x = x.InnerException;
   8:  
   9:     return x;
  10: }

 


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

Комментариев нет:

Отправить комментарий