當拋出異常時,我經常傳入格式化的字符串,公開有關發生問題的詳細信息。如果可能的話,我總是指定一個格式化提供者(這是很好的做法,否則你可能會忘記決定哪種文化是合適的,因爲缺省是當前的文化,這可能導致很多錯誤)。使用InvariantCulture或CurrentCulture格式化異常消息?
下面是一個例子:
throw new InvalidOperationException(
string.Format(
CultureInfo.CurrentCulture,
"{0} is a bad number.",
number));
我很想用CurrentCulture
,如上圖所示,由於異常消息針對人類(ofcourse,代碼不應該對異常消息本身行事)。消息將使用客戶端的文化進行格式化,因此無論何時我需要將其展示給我的客戶端,它看起來都不錯。
但是,除了向用戶顯示消息之外,還可以將異常記錄到日誌文件中。我看到許多消息都放在我的日誌文件中,用於格式化各種文化。很難看!在這種情況下,InvariantCulture
會更合適,或者是託管日誌文件的服務器的文化。
這裏的要點是,格式化一個異常時,你只是永遠不知道你的受衆,所以當格式化時決定使用哪種文化似乎是不可能的。如果能夠將格式推遲到捕獲異常的地方,那將是非常好的,但這將超出在.NET中實現異常的方式。
那麼你對此有何看法?
謝謝,這些都是很好的論點。我曾經想過在每當發現一個未處理的異常時(例如在global.asax中的ASP.NET中)向用戶顯示異常消息,但我同意最好記錄異常並顯示通用(本地化)消息。該方法使整個故事變得簡單:使用InvariantCulture始終格式化異常消息,並且不會將消息公開給客戶端。 – 2010-07-07 14:44:06