簡體   English   中英

在toString實現中捕獲泛型異常 - 不好的做法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM