2012-11-09 80 views
5

我正在使用一個使用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

這聽起來像一個除了我之外的任何人的錯誤?

+1

不解決你的問題總線的小問題,你不應該從Exception派生你的類,派生自:ApplicationException。 - http://blog.gurock.com/articles/creating-custom-exceptions-in-dotnet –

+1

謝謝!更改示例以免干擾其他人:-) –

+6

關於'ApplicationException'與'Exception',指南是**不**使用'ApplicationException'。參考:http://stackoverflow.com/a/52770/66849 – PHeiberg

回答

7

是的,它似乎是一個錯誤。看看MS Connect issue

+0

謝謝!我花了很長時間搜索連接昨天,並找不到任何相關。現在,我將屏住呼吸,直到下一個主要版本發佈出來:-) –

+0

順便說一句,有沒有人可以檢查它的.NET 4.5環境?該問題已於2010年9月結束,因此感覺應該將它變成4.5 ...謝謝! –

+1

不幸的是,這在.NET 4.5中並沒有解決。您也可以從http://referencesource.microsoft.com/netframework.aspx下載源代碼並檢查自己。所以,如果你真的打算屏住呼吸......認識你:) :) – Patko