Каков правильный способ отображения полного InnerException?

Каков правильный способ показать мое полное InnerException .

Я обнаружил, что некоторые из моих InnerExceptions имеют другое InnerException и это происходит довольно глубоко.

Будет ли InnerException.ToString() выполнять эту работу для меня или мне нужно InnerExceptions и создавать String с StringBuilder ?

Вы можете просто распечатать exception.ToString() – это также будет включать полный текст для всех вложенных InnerException s.

Просто используйте exception.ToString()

http://msdn.microsoft.com/en-us/library/system.exception.tostring.aspx

Реализация по умолчанию для ToString получает имя classа, которое выбрасывает текущее исключение, сообщение, результат вызова ToString во внутреннем исключении и результат вызова среды .StackTrace. Если какой-либо из этих элементов имеет значение NULL, его значение не включается в возвращаемую строку.

Если сообщение об ошибке отсутствует или пустая строка (“”), то сообщение об ошибке не возвращается. Имя внутреннего исключения и трассировка стека возвращаются только в том случае, если они не равны нулю.

exception.ToString () также вызывает .ToString () для внутреннего исключения этого исключения и так далее …

Обычно я делаю это, чтобы удалить большую часть шума:

 void LogException(Exception error) { Exception realerror = error; while (realerror.InnerException != null) realerror = realerror.InnerException; Console.WriteLine(realerror.ToString()) } 

@ Ответ Джона – лучшее решение, когда вам нужна полная информация (все сообщения и трассировка стека) и рекомендуемая.

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

 public static class ExceptionExtensions { public static string GetFullMessage(this Exception ex) { return ex.InnerException == null ? ex.Message : ex.Message + " --> " + ex.InnerException.GetFullMessage(); } } 

Я часто использую этот метод, когда у меня разные слушатели для отслеживания и регистрации и вы хотите иметь разные взгляды на них. Таким образом, у меня может быть один прослушиватель, который отправляет всю ошибку с трассировкой стека по электронной почте в команду dev для отладки с использованием .ToString() и тот, который записывает журнал в файл с историей всех ошибок, которые происходят каждый день без трассировка стека с помощью .GetFullMessage() .

Чтобы довольно печатать только часть Message из глубоких исключений, вы можете сделать что-то вроде этого:

 public static string ToFormattedString(this Exception exception) { IEnumerable messages = exception .GetAllExceptions() .Where(e => !String.IsNullOrWhiteSpace(e.Message)) .Select(e => e.Message.Trim()); string flattened = String.Join(Environment.NewLine, messages); // <-- the separator here return flattened; } public static IEnumerable GetAllExceptions(this Exception exception) { yield return exception; if (exception is AggregateException aggrEx) { foreach (Exception innerEx in aggrEx.InnerExceptions.SelectMany(e => e.GetAllExceptions())) { yield return innerEx; } } else if (exception.InnerException != null) { foreach (Exception innerEx in exception.InnerException.GetAllExceptions()) { yield return innerEx; } } } 

Это рекурсивно проходит через все внутренние исключения (включая случай AggregateException s) для печати всего содержащегося в них свойства Message , ограниченного разрывом строки.

Например

 var outerAggrEx = new AggregateException( "Outer aggr ex occurred.", new AggregateException("Inner aggr ex.", new FormatException("Number isn't in correct format.")), new IOException("Unauthorized file access.", new SecurityException("Not administrator."))); Console.WriteLine(outerAggrEx.ToFormattedString()); 

Outer aggr ex произошел.
Внутренний aggr ex.
Номер не в правильном формате.
Несанкционированный доступ к файлам.
Не администратор.


Для получения дополнительной информации вам нужно будет прослушивать другие свойства Exception . Например, Data будут иметь некоторую информацию. Вы можете сделать:

 foreach (DictionaryEntry kvp in exception.Data) 

Чтобы получить все производные свойства (не на базе classа Exception ), вы можете сделать:

 exception .GetType() .GetProperties() .Where(p => p.CanRead) .Where(p => p.GetMethod.GetBaseDefinition().DeclaringType != typeof(Exception)); 
  • Почему люди Java часто потребляют исключения молча?
  • Является ли это плохой практикой, чтобы поймать неспецифическое исключение, такое как System.Exception? Зачем?
  • Когда следует использовать Throwable вместо нового исключения?
  • простой пример IPython вызывает исключение на sys.exit ()
  • Зачем создавать пользовательские исключения?
  • Разница между C ++ 03 throw () specifier C ++ 11 noexcept
  • Поддерживает ли C ++ «наконец» блоки? (И что это за «RAII», о котором я все время слышу?)
  • Есть ли разница между «броском» и «броском»?
  • Oracle PL / SQL - повышение пользовательского исключения с помощью пользовательского SQLERRM
  • Различия между Исключением и ошибкой
  • Почему я получаю «Исключение; должен быть пойман или объявлен брошенным ", когда я пытаюсь скомпилировать свой Java-код?
  • Interesting Posts

    Ток состояния CSRF не соответствует одному предоставленному FB PHP SDK 3.1.1 Oauth 2.0

    множественная компоновка для разных страниц в угловом 2

    Как редактировать реестр из инструмента восстановления Vista?

    java.lang.IllegalStateException: путь к исполняемому файлу драйвера должен быть задан с помощью свойства webdriver.chrome.driver

    Oracle PL / SQL – повышение пользовательского исключения с помощью пользовательского SQLERRM

    Почему пустые блоки блокировки имеют плохую идею?

    Конвертировать PDF в документ Word?

    Как сделать нижний колонтитул фиксированным в нижней части страницы

    Могу ли я использовать скрипт bash в качестве службы в OS X без необходимости устанавливать его автозагрузчиком?

    Как проверить метод void с инструментами тестирования Junit?

    На панели инструментов нет тени по умолчанию?

    «Исправление было отправлено с сервера» при доступе к AD с C #

    Как сделать частичный элемент формы с помощью AJAX

    Должен ли разработчик ориентироваться на читаемость или производительность?

    Использование DiskLruCache в android 4.0 не предусматривает метод openCache

    Давайте будем гением компьютера.