2011-09-26 82 views
20

我正在查看一些代码,我发现e.ToString(),我想知道是否有区别使用ToString()方法,而不是.Message?Exception的.ToString()和.Message之间的区别是什么?

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

From Microsoft's Docs

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

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

+7

我想你回答了你自己的问题 –

+0

的例外是一个使用ToString的对象将对象转换为一个String(它是一个对象),所以它可能简单地等于Namespace.Exception。 –

+3

@Ramhound:'Exception'覆盖'ToString'。 – SLaks

回答

18

如果你希望得到尽可能多的信息可能在一气呵成,叫ToString()

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

它的方便,你不必所有的单个元素追加自己一起,检查,以确保没有一个是空,等这一切都建立在...

Exception.ToString Method

你也可以在reference.microsoft.com查看实际的源代码。

0

ToString方法返回Message属性以及错误发生位置的信息。

Message属性旨在用于对错误的简短描述,并且只包含执行Exception的人员放置在那里的内容。来自ToString的resport包含总是包含的附加信息。

如果您在调试模式下运行,错误报告包含更详细的信息,例如,调用堆栈中的行号。

5

ToString()返回Message以及StackTrace
ToString()也将递归地包括InnerException s。

ToString()返回一个更长的字符串,它在跟踪错误时比Message有用得多。

2

你总是可以只是尝试一下,看看:

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

(你会发现你是正确的,是的ToString更多的信息,包括除其他事项外堆栈跟踪

+4

你应该使用这个catch块代替:catch(Exception ex) Console.WriteLine(“#### TOSTRING ######”的结果); Console.WriteLine离); Console.WriteLine(); Console.WriteLine(“#### RESULT OF MESSAGE ######”);; Console.WriteLine(ex.Message); }'。这将有助于OP区分两者的输出 –

0

电子。ToString()会给你一个像PrintTrace这样的详细消息,我认为哪个Display是异常名称和异常被抛出的那一行,其中e.Message输出只有一个只读规范的可读消息。

您可以检查异常基类的构造

12

尝试使用.NET反射器或类似的,看看有什么关于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; 
} 
相关问题