考慮一些可以拋出檢查異常的代碼(類型爲Exception
的例外)。當然,你的代碼catch
是個例外。你不只是吞下異常,你的代碼通過你的用戶界面以某種方式報告給用戶。在一個日誌文件中,或者使用GUI彈出窗口。是否應該報告異常的消息文本?
您向用戶報告的文本是否應該包含異常的消息文本。也就是說,文中提供的Throwable.getMessage()
或Throwable.getLocalizedMessage()
?
我認爲不是,但似乎很多人不同意我。那麼我有什麼錯誤?我的論點如下。
- 該消息是在拋出異常時創建的。因此,它最多隻能提供非常低的信息,這可能不適合向用戶報告。
- 在哲學上,使用該消息對我來說似乎違反了例外的全部觀點,即將檢測和啓動錯誤處理(
throw
部分)與完成處理和報告(catch
部分)分開。使用該消息意味着該消息必須適合於報告,這將報告的責任轉移到僅應該對檢測和啓動負責的位置。也就是說,我認爲Throwable
設計的getMessage()
部分是一個錯誤。 - 該消息未本地化。儘管它的名稱是
getLocalizedMessage()
,但它並不是很好,因爲您可能不知道要使用的語言環境,除非您的例外情況是catch
(是由英語系統管理員閱讀的系統日誌報告,還是以彈出式格式用於GUI的法國用戶的窗口?)。 - 我聽說Java 7的
IOException
的異常層次結構有了很大的改進,使您能夠處理不同種類的I/O錯誤,不同的catch
子句,使得getMessage()
文本不那麼重要。這意味着即使Java設計人員對getMessage()
也有些不舒服。
我不問是否報告堆棧跟蹤是非常有用的。堆棧跟蹤對於表示錯誤的異常是唯一有用的。也就是說,對於一個未經檢查的例外。我認爲在這種情況下,提供異常信息的底層細節不僅有用,而且是強制性的。但是我的問題涉及檢查的異常,例如文件未找到。
一個相關的問題:http://stackoverflow.com/questions/2790528/extracting-user-friendly-exception-details-in-java – Raedwald
沒有1尺寸適合所有。這取決於「誰是你的目標受衆?」 – Pacerier