2017-01-03 28 views
3

如果我們捕獲異常,然後拋出異常,但不是相同類型(僅基於第一個),它是否仍然是反模式以記錄第一個?日誌異常並拋出新的異常 - 它是否爲反模式?

簡單的例子:

} catch (CloneNotSupportedException e) { 
     log.warn(e, e.getMessage()); 
     throw new InternalError(e.getMessage()); 
    } 
+0

我認爲這是一個意見問題。有些人將整個clone()接口視爲從Java 1.0繼承的不良模式。我會試圖有一個不同的界面,包裝這個例如。 '可複製的' –

+3

有很多情況下,你想捕捉異常,記錄它,並拋出一個不同的。你所捕獲的異常是你所調用的代碼暴露的內容。你拋出的異常是你想讓任何人打電話給你的代碼的東西。 (這通常是我正在談論的,而不是你必須通過使用'Cloneable'的廢話。) – khelwood

+0

我不會稱之爲反模式。我不會記錄它,因爲原來的異常被包裝在一個新的異常中,所以沒有信息丟失。調用者現在可以確定是否以及如何記錄它。 – f1sh

回答

2

追趕的exception,創建日誌消息,並拋出一個新的exception不是一個反模式可言。

一般來說,當你有一個跨越特定系統邊界的交互/通信時,這個「模式」就會起作用,例如,兩層,模塊或組件之間的通信。例如,這可以是客戶端服務器交互,應用程序層與持久層或模塊x調用模塊y的服務進行交互。

讓我們仔細看看模式的動作。

記錄異常? 您想在發生異常的地方記錄異常。這並不意味着您必須將其記錄在發生的地方,但至少在您的情況下。 另外,請考慮您的日誌記錄配置。您可能有包,組件,系統...相關的配置,並且希望確保您在正確的日誌中看到異常。

拋出一個新的異常? 通常,新的異常是舊異常的抽象。這很有用,因爲方法調用者不必處理很多不同的異常。 此外,您不希望調用者總是詳細瞭解您的上下文中發生了什麼,因此使用新的異常允許您隱藏信息。

捕捉異常? 顯然,這是需要的,其他行動可以執行。