В чем разница между .ToString () и .Message исключений? - PullRequest
21 голосов
/ 26 сентября 2011

Я просматриваю некоторый код и нашел e.ToString (), и мне было интересно, есть ли разница в использовании метода ToString () вместо .Message?

Читая ниже, звучиткак будто он возвращает больше информации.

Из документов Microsoft

ToString Поддерживается .NET Compact Framework.Переопределена.Создает и возвращает строковое представление текущего исключения.

Сообщение Поддерживается .NET Compact Framework.Получает сообщение, описывающее текущее исключение.

Ответы [ 6 ]

19 голосов
/ 26 сентября 2011

Если вы хотите получить как можно больше информации за один раз, позвоните ToString():

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

Удобно, что вам не нужно добавлять все отдельные элементы вместе, проверяя, чтобы убедиться, что ни один из них не являетсяnull и т. д. Это все встроено ...

Exception.ToString Method

Вы также можете проверить фактический исходный код на reference.microsoft.ком .

12 голосов
/ 26 сентября 2011

Попробуйте использовать .NET Reflector или аналогичный, чтобы увидеть, что делает метод ToString в System.Exception:

[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public override string ToString()
{
    return this.ToString(true);
}

private string ToString(bool needFileLineInfo)
{
    string className;
    string message = this.Message;
    if ((message == null) || (message.Length <= 0))
    {
        className = this.GetClassName();
    }
    else
    {
        className = this.GetClassName() + ": " + message;
    }
    if (this._innerException != null)
    {
        className = className + " ---> " + this._innerException.ToString(needFileLineInfo) + Environment.NewLine + "   " + Environment.GetRuntimeResourceString("Exception_EndOfInnerExceptionStack");
    }
    string stackTrace = this.GetStackTrace(needFileLineInfo);
    if (stackTrace != null)
    {
        className = className + Environment.NewLine + stackTrace;
    }
    return className;
}
7 голосов
/ 26 сентября 2011

ToString() возвращает Message вместе с StackTrace.
ToString() также будет рекурсивно включать InnerException с.

ToString() возвращает гораздо более длинную строку, которая гораздо полезнее, чем Message при отслеживании ошибок.

3 голосов
/ 26 сентября 2011

Вы всегда можете просто попробовать и посмотреть:

try 
{
  throw new Exception("This is a test.");
}
catch ( Exception ex )
{
  Console.WriteLine(ex);
  Console.WriteLine(ex.Message);
}

(Вы поймете, что вы правы, .ToString более информативен, включая, среди прочего, трассировку стека.

1 голос
/ 26 сентября 2011

e.ToString () даст вам подробное сообщение, такое как PrintTrace, я думаю, какое отображение - это имя исключения и строка, в которую было брошено исключение, где вывод e.Message - только читаемое сообщение без спецификации.

Вы можете проверить конструктор базы исключений

1 голос
/ 26 сентября 2011

Методы ToString возвращают свойство Message вместе с информацией о том, где произошла ошибка.

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

Если вы работаете в режиме отладки, отчет об ошибке содержит более подробную информацию, например, номера строк в стеке вызовов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...