[英]Catching generic Exception in a toString implementation - bad practice?
我有一個域模型類,其中包含一個toString實現,如下所示:
public String toString() {
try {
return getX() + "\n"
getY() + "\n"
getZ(); //etc.
} catch(Exception e) {
throw new RuntimeException(e);
}
}
getX()
, getY()
和getZ()
方法不是簡單的getter,它們可以在后台執行查找,通常是查找預定義鍵值對的靜態映射。 他們中的一些人在他們的簽名中throws SomeCheckedException
。
我的印象是,這是不好的做法和“代碼味道”。 toString()
甚至需要這個檢查這一事實對我來說是一個糟糕設計的症狀。 但是我被一位同事問到,在toString()
捕獲泛型Exception
有什么問題,因為捕獲的Exception
會進一步傳播。
我認為它至少違反了KISS原則,因為像這里的toString()
這樣的簡單方法被指示為需要特殊的異常處理。
那么在toString()中有一個catch-all塊的代碼味道是什么?
我發現的答案要么是針對捕獲泛型Exception
一般Exception
而且我同意其中的大多數,如果你正在做一般的錯誤處理機制或批處理,那么它應該用於通用異常。 這個論點在我們的討論中並不令人信服,所以我對其他觀點感到好奇。
是的,這是不好的做法。
toString方法的目的是為程序員提供類的可讀表示。 您不應在此方法中包含任何方法調用,包括getter。
事實上,我認為不會自動生成這些方法,但假設您不舒服或無法使用可以為您生成它們的IDE,我建議包含對該對象上所有字段的引用,以及類名稱對象,由intellij toString方法完成
對於toString()
方法, 捕獲 Exception
不一定是壞習慣。 然而, 重新投擲它是有問題的部分。
toString()的合同是:
...通常,toString方法返回一個“文本表示”此對象的字符串。 結果應該是一個簡潔但信息豐富的表示,便於人們閱讀......
在Effective Java 3rd Edition(Item 12)中,Bloch進一步堅持:
實際上,toString方法應該返回對象中包含的所有有趣信息。
因此,如果這需要調用可能拋出已檢查異常的方法,那么就這樣,並且捕獲這些異常很有意義。
但是:已提升的已檢查異常提供有關對象狀態的信息。 始終與目標toString
,它可能是一個好主意,包括返回的消息中的異常情況toString
。
至於為什么從toString
拋出異常是個壞主意, 這篇文章提供了一個很好的答案。
建議:使用特定的異常類型捕獲已檢查的異常,並將此事實集成到toString()
消息中,而不是傳播它。
不在任何地方捕獲通用異常的主要原因是它也將包含RuntimeExceptions,在正常情況下不應該捕獲它,因為它們總是代表程序中的錯誤 。 讓它們傳播和出現更好,這樣開發人員就可以注意到並最終修復它。
我不知道在toString
方法的情況下是否應該應用任何額外的良好實踐檢查,但我確信至少應該應用一般規則。
因此,最佳做法是始終只捕獲已檢查的異常 ,然后要么恢復,要么重新拋出它們,要么將它們重新轉換為另一個異常(這是您的情況)。
是否應該通過失敗的toString()方法中斷“正常流程”? 如果答案為否,則應使toString()方法“正常”。 捕獲異常並在結果中反映這一點是一種可能性,或簡單的日志輸出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.