Исключение. Сообщение по сравнению с исключением. ToString ()

У меня есть код, который регистрируется Exception.Message. Однако я прочитал статью, в которой говорится, что лучше использовать Exception.ToString(). С последним Вы сохраняете более важную информацию об ошибке.

Это верное, и это безопасный идти вперед и заменить весь вход кода Exception.Message?

Я также использую базирующееся расположение XML для log4net. Действительно ли это возможно это Exception.ToString() может содержать недопустимые символы XML, которые могут вызвать проблемы?

191
задан Jesse 9 September 2013 в 14:55
поделиться

6 ответов

Exception.message содержит только сообщение (doh), связанное с исключением. Пример:

Ссылка на объект не установлена ​​на экземпляр объекта

. Метод Exception.toString () даст гораздо более многолетний выход, содержащий тип исключения, сообщение (от ранее). , след стека и все эти вещи снова для вложенных / внутренних исключений. Точнее, метод возвращает следующее:

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

Реализация TOSTRING по умолчанию получает имя класса, который бросил текущее исключение, сообщение, результат вызова TOSTRING на внутреннем исключении и результатом вызовов среды .stacktrace. Если какой-либо из этих членов является нулевой ссылкой (ничего в Visual Basic), его значение не включено в возвращенную строку.

Если нет сообщения об ошибке или если это пустая строка («»), то сообщение об ошибке возвращается. Название внутреннего исключения и трассировки стека возвращаются только в том случае, если они не являются нулевой ссылкой (ничего в Visual Basic).

258
ответ дан 23 November 2019 в 05:34
поделиться

Я думаю, вы могли бы сделать свой собственный метод, чтобы создать этот дисплей, так как это зависит от того, является или нет это целое число.

public static class Extensions
{
    public static string ToCustomString(this decimal d)
    {
        int i = (int)d;
        if (i == d)
            return i.ToString();

        return d.ToString("#.00");
    }
}
-121--3677739-

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

float fVal = 1234.20f;
String strVal = fVal.Tostring("c");
-121--3677740-

Я бы сказал, что @ Wim прав. Для просмотра файлов журнала следует использовать ToString () - при условии наличия технической аудитории - и Message , если это вообще необходимо. Можно утверждать, что даже это не подходит для пользователя, для каждого типа исключения и возникновения там (подумайте об ArgumentExceptions и т.д.).

Кроме StackTrace, ToString () будет содержать информацию, которую вы не получите иначе. Например, выходные данные слияния, если включено для включения сообщений журнала в «сообщения об исключении».

Некоторые типы исключений даже включают дополнительную информацию (например, из пользовательских свойств) в ToString () , но не в сообщении.

9
ответ дан 23 November 2019 в 05:34
поделиться

Что касается XML-формата для log4net, то вам не нужно беспокоиться о функции ex.ToString() для журналов. Просто передайте сам объект исключения, а в остальном log4net предоставит вам все подробности в предварительно настроенном XML-формате. Единственное, с чем я иногда сталкиваюсь - это новое форматирование строк, но именно тогда я читаю файлы raw. В противном случае анализ XML работает отлично.

3
ответ дан 23 November 2019 в 05:34
поделиться

В дополнение к тому, что уже говорилось, не используют TOSTRING () на объекте исключения для отображения пользователю. Сообщение сообщение должности .

С точки зрения целей лесозаготовок, определенно используйте TOSTRING () , на исключение, не только в сообщение , что и в большинстве сценариев, вы будете оставлены царапающими голову, где конкретно Это исключение произошло, и какой стек вызова был. Stacktrace сказал бы вам все это.

49
ответ дан 23 November 2019 в 05:34
поделиться

Ну, я бы сказал, что это зависит от того, что ты хочешь увидеть в журналах, не так ли? Если тебя устраивает то, что предоставляет бывшая, используй это. Иначе используйте ex.toString() или даже регистрируйте трассу стека.

0
ответ дан 23 November 2019 в 05:34
поделиться

зависит от необходимой вами информации. Для отладки стека трассировки и внутреннее исключение полезно:

    string message =
        "Exception type " + ex.GetType() + Environment.NewLine +
        "Exception message: " + ex.Message + Environment.NewLine +
        "Stack trace: " + ex.StackTrace + Environment.NewLine;
    if (ex.InnerException != null)
    {
        message += "---BEGIN InnerException--- " + Environment.NewLine +
                   "Exception type " + ex.InnerException.GetType() + Environment.NewLine +
                   "Exception message: " + ex.InnerException.Message + Environment.NewLine +
                   "Stack trace: " + ex.InnerException.StackTrace + Environment.NewLine +
                   "---END Inner Exception";
    }
8
ответ дан 23 November 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: