2010-06-20 32 views
10

我不知道爲什麼從基類庫的.NET的異常類,默認擁有一些可變成員爲什麼.NET異常是可變的?

  • 爲什麼我可以改變從DataSourceHelpLink和價值觀,但不能改變其他任何類似的Message
  • 爲什麼拋出異常會重寫StackTrace使其變得可變?追加堆棧跟蹤信息到現有的跟蹤會更好的設計(但仍然可以)?
  • .NET異常設計可能有哪些改進?

我只是在設計上選擇感興趣的......

回答

9

StackTrace對我來說很有意義,至少。這個想法是,一個Exception(作爲一個對象)可能被傳遞,從方法返回等等。StackTrace只有在引發和捕獲異常時才重要。從某種意義上說,StackTrace真的是越拋出異常,而不是Exception對象本身的的財產。

至於其他性質的可變性,我認爲它只是因爲它更容易將其分配給的屬性,而不是強迫他們都到構造函數構造一個實例。請記住,在設計時刻Exception時,C#沒有可選參數。

你可以考慮重新設計,其中Exception和派生類是不可變的,但是這需要一個異常工廠或生成器類。它只會從Exception派生出更加複雜的結果。

+0

好的,如果問題是將大量數據傳遞給異常,爲什麼'Message'屬性是隻讀的? – ControlFlow 2010-06-20 19:14:47

+0

關於'StackTrace'的不錯想法... – ControlFlow 2010-06-20 19:20:18

+0

'Message'是一個非可選的信息片段,因此將它放在構造函數中是有意義的。 – 2010-06-20 19:23:15