У меня есть код, который входит в систему Exception.Message
. Тем не менее, я прочитал статью, в которой говорится, что лучше использовать Exception.ToString()
. С последним вы сохраняете более важную информацию об ошибке.
Это правда, и безопасно ли идти вперед и заменить все записи кода Exception.Message
?
Я также использую макет на основе XML для log4net . Возможно ли, что Exception.ToString()
могут содержать недопустимые символы XML, что может вызвать проблемы?
Ответы:
Exception.Message
содержит только сообщение (doh), связанное с исключением. Пример:Exception.ToString()
Метод даст намного более подробный вывод, содержащий тип исключения, сообщение (с) до того , трассировки стека, и все эти вещи снова для вложенных / внутренних исключений. Точнее, метод возвращает следующее:источник
В дополнение к тому, что уже было сказано, не используйте
ToString()
объект исключения для отображения пользователю. Достаточно толькоMessage
свойства или пользовательского сообщения более высокого уровня.С точки зрения ведения журнала, определенно используйте
ToString()
Исключение, а не толькоMessage
свойство, как в большинстве сценариев, вам придется почесать голову, где конкретно произошло это исключение, и каков был стек вызовов. Stacktrace сказал бы вам все это.источник
Преобразование целого исключения в строку
Звонок
Exception.ToString()
дает вам больше информации, чем просто использованиеException.Message
собственности. Тем не менее, даже это все еще оставляет много информации, в том числе:Data
коллекции найдено во всех исключениях.Есть моменты, когда вы хотите получить эту дополнительную информацию. Код ниже обрабатывает вышеуказанные сценарии. Он также записывает свойства исключений в хорошем порядке. Он использует C # 7, но при необходимости его будет очень легко конвертировать в более старые версии. Смотрите также этот связанный ответ.
Главный совет - регистрация исключений
Большинство людей будут использовать этот код для регистрации. Подумайте об использовании Serilog с моим пакетом Serilog.Exceptions NuGet, который также регистрирует все свойства исключения, но делает это быстрее и без отражения в большинстве случаев. Serilog - это очень продвинутый каркас журналирования, который очень популярен на момент написания.
Главный совет - следы стека, читаемые человеком
Вы можете использовать пакет NuGet Ben.Demystifier для получения удобочитаемых трассировок стека для ваших исключений или пакет NuGet serilog-enrichers-demystify, если вы используете Serilog.
источник
Я бы сказал, что @ Вим прав. Вы должны использовать
ToString()
для лог-файлов - при условии технической аудитории - иMessage
, если вообще, для отображения пользователю. Можно утверждать, что даже это не подходит для пользователя, для всех типов исключений и случаев (например, ArgumentExceptions и т. Д.).Также, помимо StackTrace,
ToString()
будет включена информация, которую вы не получите иначе. Например, вывод слияния, если он включен включать сообщения журнала в исключение «сообщения».Некоторые типы исключений даже включают дополнительную информацию (например, из пользовательских свойств) в
ToString()
, но не в Сообщение.источник
Зависит от необходимой вам информации. Для отладки трассировки стека и внутреннего исключения полезны:
источник
Exception.ToString()
вам даст, верно?StringBuilder
в этом случае вполне может быть более дорогим , чем две новые строки распределения, это очень спорно , было бы более эффективным здесь. Мы не имеем дело с итерациями. Лошади на курсы.С точки зрения формата XML для log4net вам не нужно беспокоиться о ex.ToString () для журналов. Просто передайте сам объект исключения, а log4net сделает все остальное и предоставит вам все детали в предварительно настроенном формате XML. Единственное, с чем я иногда сталкиваюсь, это форматирование новой строки, но именно тогда я читаю сырые файлы. В противном случае синтаксический анализ XML прекрасно работает.
источник
Ну, я бы сказал, это зависит от того, что вы хотите увидеть в журналах, не так ли? Если вы довольны тем, что предоставляет ex.Message, используйте это. В противном случае используйте ex.toString () или даже зарегистрируйте трассировку стека.
источник