我正在使用一個使用Exception.ToString()報告異常的測試框架。Exception.ToString在.NET 4.0中損壞?
昨天我遇到了嵌套異常的不完整報告,經過一些使用Reflector的工作後得出結論,.NET 4.0已經打破瞭如何組成內部異常字符串表示。
下面是一個例子;
public class MyException : Exception
{
DateTime when;
public MyException(DateTime when)
{
this.when = when;
}
public override string ToString()
{
var builder = new StringBuilder();
builder.AppendFormat("Happened at: {0}\r\n", this.when);
builder.Append(base.ToString());
return builder.ToString();
}
}
class Program
{
private static void throws()
{
throw new Exception("bobby!", new MyException(DateTime.Now));
}
private static void catches()
{
try
{
throws();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
static void Main(string[] args)
{
catches();
}
}
控制檯輸出,這裏將不包含我的自定義前綴「在事情發生」。
請注意,如果我們直接拋出MyException,而不是嵌套在另一個異常中,將使用自定義字符串rep。
原來的原因是Exception.ToString()不再調用內部異常的ToString(),而是一個私有方法,的ToString(布爾),即
// Exception
public override string ToString()
{
return this.ToString(true);
}
private string ToString(bool needFileLineInfo)
{
// yada yada
if (this._innerException != null)
{
result += "some stuff " + this._innerException.ToString(needFileLineInfo) + " some more stuff";
^^^^^^^^^^^^^^^^^^^^^^^^^^
}
// yada yada
return result;
}
所以,既然例外。 ToString()不再調用內部異常的ToString(),該實現短暫地爲內部異常定製了字符串表示的機會。
在.NET 2.0中,可覆蓋的ToString()按預期調用,所以這是一個突破性改變。
該文檔沒有改變,仍然聲稱;
的ToString的默認實現獲取類 拋出當前異常的消息,稱內部異常的 的ToString結果的名稱[...]
http://msdn.microsoft.com/en-us/library/system.exception.tostring.aspx
這聽起來像一個除了我之外的任何人的錯誤?
不解決你的問題總線的小問題,你不應該從Exception派生你的類,派生自:ApplicationException。 - http://blog.gurock.com/articles/creating-custom-exceptions-in-dotnet –
謝謝!更改示例以免干擾其他人:-) –
關於'ApplicationException'與'Exception',指南是**不**使用'ApplicationException'。參考:http://stackoverflow.com/a/52770/66849 – PHeiberg