我正在查看一些代码,我发现了e.ToString(),我想知道使用ToString()方法而不是.Message是否存在差异?
在下面阅读,听起来它会返回更多信息。
的ToString 受.NET Compact Framework支持。 覆盖。创建并返回当前异常的字符串表示形式。
信息 受.NET Compact Framework支持。 获取描述当前异常的消息。
答案 0 :(得分:19)
如果您希望一次性获取尽可能多的信息,请致电ToString()
:
ToString的默认实现获取抛出当前异常的类的名称,消息 (我的重点),在内部异常上调用ToString的结果,以及调用Environment.StackTrace的结果。如果这些成员中的任何一个是Nothing,则其值不包含在返回的字符串中。
方便的是,您不必自己将所有单个元素附加在一起,检查以确保没有空元素等等。它都是内置的......
您还可以在reference.microsoft.com查看实际的源代码。
答案 1 :(得分:12)
尝试使用.NET Reflector或类似的东西来查看System.Exception上的ToString方法正在做什么:
[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;
}
答案 2 :(得分:7)
ToString()
会返回Message
以及StackTrace
ToString()
也会递归地包含InnerException
s。
ToString()
会返回一个更长的字符串,在追踪错误时比Message
更有用。
答案 3 :(得分:3)
您可以随时尝试并查看:
try
{
throw new Exception("This is a test.");
}
catch ( Exception ex )
{
Console.WriteLine(ex);
Console.WriteLine(ex.Message);
}
(你会发现你是对的,.ToString提供更多信息,包括堆栈跟踪等。
答案 4 :(得分:1)
ToString
方法返回Message
属性以及错误发生位置的信息。
Message
属性用于描述错误的简短描述,并且仅包含实现异常的人员所在的内容。来自ToString
的转发包含始终包含的其他信息。
如果您在调试模式下运行,则错误报告包含更多详细信息,例如调用堆栈中的行号。
答案 5 :(得分:1)
e.ToString()将为您提供类似PrintTrace的详细消息,我认为哪个显示器是异常名称和抛出异常的行,其中e.Message输出是一个只有没有规范的可读消息。
您可以检查异常基础构造函数