Exception .ToString()和.Message之间有什么区别?

时间:2011-09-26 14:55:29

标签: c# exception

我正在查看一些代码,我发现了e.ToString(),我想知道使用ToString()方法而不是.Message是否存在差异?

在下面阅读,听起来它会返回更多信息。

From Microsoft's Docs

的ToString 受.NET Compact Framework支持。 覆盖。创建并返回当前异常的字符串表示形式。

信息 受.NET Compact Framework支持。 获取描述当前异常的消息。

6 个答案:

答案 0 :(得分:19)

如果您希望一次性获取尽可能多的信息,请致电ToString()

  

ToString的默认实现获取抛出当前异常的类的名称,消息 (我的重点),在内部异常上调用ToString的结果,以及调用Environment.StackTrace的结果。如果这些成员中的任何一个是Nothing,则其值不包含在返回的字符串中。

方便的是,您不必自己将所有单个元素附加在一起,检查以确保没有空元素等等。它都是内置的......

Exception.ToString Method

您还可以在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输出是一个只有没有规范的可读消息。

您可以检查异常基础构造函数