2011-09-06 53 views
10

考慮一些可以拋出檢查異常的代碼(類型爲Exception的例外)。當然,你的代碼catch是個例外。你不只是吞下異常,你的代碼通過你的用戶界面以某種方式報告給用戶。在一個日誌文件中,或者使用GUI彈出窗口。是否應該報告異常的消息文本?

您向用戶報告的文本是否應該包含異常的消息文本。也就是說,文中提供的Throwable.getMessage()Throwable.getLocalizedMessage()

我認爲不是,但似乎很多人不同意我。那麼我有什麼錯誤?我的論點如下。

  • 該消息是在拋出異常時創建的。因此,它最多隻能提供非常低的信息,這可能不適合向用戶報告。
  • 在哲學上,使用該消息對我來說似乎違反了例外的全部觀點,即將檢測和啓動錯誤處理(throw部分)與完成處理和報告(catch部分)分開。使用該消息意味着該消息必須適合於報告,這將報告的責任轉移到僅應該對檢測和啓動負責的位置。也就是說,我認爲Throwable設計的getMessage()部分是一個錯誤。
  • 該消息未本地化。儘管它的名稱是getLocalizedMessage(),但它並不是很好,因爲您可能不知道要使用的語言環境,除非您的例外情況是catch(是由英語系統管理員閱讀的系統日誌報告,還是以彈出式格式用於GUI的法國用戶的窗口?)。
  • 我聽說Java 7的IOException的異常層次結構有了很大的改進,使您能夠處理不同種類的I/O錯誤,不同的catch子句,使得getMessage()文本不那麼重要。這意味着即使Java設計人員對getMessage()也有些不舒服。

我不問是否報告堆棧跟蹤是非常有用的。堆棧跟蹤對於表示錯誤的異常是唯一有用的。也就是說,對於一個未經檢查的例外。我認爲在這種情況下,提供異常信息的底層細節不僅有用,而且是強制性的。但是我的問題涉及檢查的異常,例如文件未找到。

+0

一個相關的問題:http://stackoverflow.com/questions/2790528/extracting-user-friendly-exception-details-in-java – Raedwald

+0

沒有1尺寸適合所有。這取決於「誰是你的目標受衆?」 – Pacerier

回答

6

沒有例外不應直接在直接的錯誤信息給用戶顯示,他們是低層次的技術細節和用戶幾乎總是想要更多的東西可以理解的,即使它不提供儘可能多的信息作爲堆棧跟蹤會!

我說的幾乎都是因爲有這樣的情況(如在集成開發環境),您可以考慮用戶在技術上足以勝任看堆棧跟蹤;事實上,在這種情況下,他們可能會更喜歡它「誤入歧途」的錯誤信息。

但是,我個人認爲堆棧跟蹤應該始終記錄在用戶可以訪問的某個位置,以便如果他們抱怨「該程序無法正常工作」,那麼您可以確切地看到如果他們向您發送該文件會發生什麼。

5

如果您向用戶顯示錯誤情況,則應該是用戶友好的消息。例外包含用戶不應/不需要知道的技術細節。

在某些情況下,顯示堆棧跟蹤信息可能是一個安全問題,所以用戶不應該顯示堆棧跟蹤。

如果您向用戶顯示錯誤消息,有一點您有意識地決定顯示一個彈出窗口,或添加一條消息到日誌窗口。此時,您可以將任何異常轉換爲更加用戶友好的消息。請注意,您可能需要比默認的Exception類型提供的更多信息,因此您可以/應該創建自己的Exception類型,其中包含向用戶提供所需的所有數據所需的全部信息。

+1

堆棧跟蹤對於表示錯誤的異常是唯一有用的。也就是說,對於一個未經檢查的例外。我認爲提供異常信息的低級細節的怒容不僅有用而且是強制性的。但是我的問題涉及檢查異常,例如文件未找到。 – Raedwald

+0

如果由於嚴重錯誤而導致異常,您希望QA檢測到它。儘管如此,如果應用程序崩潰,您可以顯示一條消息,要求用戶提交重現報告。如果你沒有躲在周圍的任何細節的安全要求,不是顯示堆棧跟蹤.... – hvgotcodes

4

在一些項目中,我做了一種特殊的例外(例如UserFriendlyException)。此異常類型必須具有用戶友好的錯誤消息。如果我發現這種異常,我可以將其顯示給用戶。

這使得可以使用用戶友好的錯誤異常,並防止你表現的很技術的信息給用戶。

+2

這仍然會將責任在該位置創建一個用戶友好的消息'throw's例外,而不是位置是'抓住它。它只是用'getFriendlyMessage()'代替'getMessage()',這看起來並沒有什麼收穫。 – Raedwald

0

我認爲你不應該表現出異常消息本身給用戶,它應該永遠只能出現在日誌中。即使您有目的地使用戶友好,它仍然不會顯示,因爲您不能輕鬆國際化這些消息。您應該想出一些UI層可以理解的機制,並將其解決爲可以查找國際化消息以顯示給用戶的代碼。我發現一個帶有「code」屬性/枚舉的異常工作得很好。非常特殊的例外也可以工作,但這可能很難維持。

+0

日誌的讀者也是應用程序的用戶。 – Raedwald