Подтвердить что ты не робот

В чем разница между Exception.ToString() и .Message?

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

Ниже, как кажется, возвращается больше информации.

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

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

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

4b9b3361

Ответ 1

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

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

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

Метод Exception.ToString

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

Ответ 2

Попробуйте использовать .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;
}

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

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

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

Ответ 6

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

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