這是.NET的System.Exception.ToString
實際來源:爲什麼System.Exception.ToString爲內部異常調用虛擬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版本中有沒有隱藏的智慧?
編輯:這不是基於意見的問題。雖然我覺得這個設計選擇令人討厭,但我想知道這種方法的好處。在設計新的解決方案時瞭解它們可能是有益的。
我明白你的觀點,但要注意向用戶呈現異常堆棧和/或調用堆棧可能是一個安全性問題。更不用說,默認的'ToString'也會打印'Message'屬性,它可能包含有意義的數據。因此,如果這是微軟的設計決策,它最終會成爲一個既不符合安全性又不符合信息性的中間環境。對於「零售」程序,您根本不應顯示「ToString」的結果,對於內部技術,您需要更多信息(它就在那裏!)。 – gwiazdorrr