Какой правильный способ показать мое полное InnerException
.
Я обнаружил, что некоторые из моих InnerExceptions имеют другое, InnerException
и это происходит довольно глубоко.
Будет InnerException.ToString()
ли работа для меня или мне нужно пройти через InnerExceptions
и создать String
с StringBuilder
?
c#
exception
inner-exception
Willem
источник
источник
Ответы:
Вы можете просто напечатать
exception.ToString()
- это также будет включать в себя полный текст для всех вложенныхInnerException
элементов.источник
ToString
методы для внутренних исключений, как описано в разделе Почему System.Exception.ToString не вызывает виртуальный ToString для внутренних исключений? ,Просто используйте
exception.ToString()
http://msdn.microsoft.com/en-us/library/system.exception.tostring.aspx
exception.ToString () также вызовет .ToString () для внутреннего исключения этого исключения и так далее ...
источник
Я обычно делаю так, чтобы удалить большую часть шума:
Редактировать: я забыл об этом ответе и удивлен, что никто не указал, что вы можете просто сделать
источник
error.GetBaseException()
. Я считаю, что это делает то же самое ...@ Ответ Джона - лучшее решение, когда вам нужна полная детализация (все сообщения и трассировка стека) и рекомендуемое.
Однако могут быть случаи, когда вам просто нужны внутренние сообщения, и для этих случаев я использую следующий метод расширения:
Я часто использую этот метод, когда у меня есть разные слушатели для отслеживания и ведения журнала, и я хочу иметь разные взгляды на них. Таким образом, у меня может быть один прослушиватель, который отправляет всю ошибку с трассировкой стека по электронной почте команде разработчиков для отладки с использованием
.ToString()
метода, и тот, который записывает файл журнала с историей всех ошибок, которые произошли каждый день без трассировки стека с.GetFullMessage()
метод.источник
ex
естьAggregateException
, ни одно из внутренних исключений не будет включено в этот выводЧтобы распечатать только
Message
часть глубоких исключений, вы можете сделать что-то вроде этого:Это рекурсивно проходит через все внутренние исключения (включая случай
AggregateException
s), чтобы напечатать всеMessage
содержащиеся в них свойства, разделенные переводом строки.Например
Вам нужно будет прослушать другие свойства исключения для получения более подробной информации. Например,
Data
будет иметь некоторую информацию. Вы могли бы сделать:Чтобы получить все производные свойства (не для базового
Exception
класса), вы можете сделать:источник
IEnumerable<Exception>
вместо жесткого кодированияAggregrateException
для обработки других подобных типов. Также исключитьp.IsSpecialName
иpi.GetIndexParameters().Length != 0
избежать проблем. Включение имени типа исключения в выходные данные также является хорошей идеейЯ делаю:
Это «печатает» все внутренние исключения, а также обрабатывает AggregateExceptions и случаи, когда InnerException.Message совпадает с Message
источник
Если вы хотите получить информацию обо всех исключениях, используйте
exception.ToString()
. Он будет собирать данные из всех внутренних исключений.Если вы хотите только оригинальное исключение, используйте
exception.GetBaseException().ToString()
. Это даст вам первое исключение, например, самое глубокое внутреннее исключение или текущее исключение, если нет внутреннего исключения.Пример:
источник
наращивание по ответу nawfal.
при использовании его ответа отсутствовала переменная aggrEx, я ее добавил.
файл ExceptionExtenstions.class:
источник
e.StackTrace == null