В чем разница между Exception.ToString() и .Message?
Я просматриваю код, и я нашел e.ToString(), и мне было интересно, есть ли разница с использованием метода ToString() вместо .Message?
Ниже, как кажется, возвращается больше информации.
Из документов Microsoft
ToString
Поддерживается .NET Compact Framework.
Переопределена. Создает и возвращает строковое представление текущего исключения.
Сообщение
Поддерживается .NET Compact Framework.
Получает сообщение, описывающее текущее исключение.
Ответы
Ответ 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 выводит только чтение без спецификации.
Вы можете проверить конструктор базы исключений