【发布时间】:2013-12-16 00:40:40
【问题描述】:
这是 .NET 的 System.Exception.ToString 的实际来源:
public override string ToString()
{
return this.ToString(true, true);
}
private string ToString(bool needFileLineInfo, bool needMessage)
{
string str1 = needMessage ? this.Message : (string) null;
string str2 = str1 == null || str1.Length <= 0 ? this.GetClassName() : this.GetClassName() + ": " + str1;
if (this._innerException != null)
str2 = str2 + " ---> " + this._innerException.ToString(needFileLineInfo, needMessage) + Environment.NewLine + " " + Environment.GetRuntimeResourceString("Exception_EndOfInnerExceptionStack");
string stackTrace = this.GetStackTrace(needFileLineInfo);
if (stackTrace != null)
str2 = str2 + Environment.NewLine + stackTrace;
return str2;
}
除了丑陋之外,人们可以注意到对于所有内部异常,将调用私有的、非虚拟的 ToString。换句话说,如果你在你的异常中重载ToString如果你的异常恰好是嵌套的,它就不会被调用。哦,等一下,原来内置异常也有同样的问题,例如System.IO.FileNotFoundException 打印出文件的路径 - 它不是消息的一部分:
public override string ToString()
{
string str = this.GetType().FullName + ": " + this.Message;
if (this._fileName != null && this._fileName.Length != 0)
str = str + Environment.NewLine + Environment.GetResourceString("IO.FileName_Name", new object[1]
{
(object) this._fileName
});
...
}
但是如果你包装了一个实例......这些信息将会丢失,除非你自己遍历异常树并检测异常的类型,或者自己调用ToString 并进行一些普通的解析。
这是一个令人讨厌的不便,使记录/写入错误对话框丢失信息或容易出错。有趣的是,Mono gets it right。
.NET 的版本有什么隐藏的智慧吗?
编辑:这不是基于意见的问题。虽然我觉得这种设计选择很烦人,但我想知道这种方法的好处。在设计新的解决方案时了解它们可能会有所帮助。
【问题讨论】: