2017-10-11 83 views
2

我有我自己的異常,由我的類BrowserException拋出。
這可能是因爲某些內部問題,即UnsupporderEncodingException。suppressException和原因之間的區別

現在我有兩個選擇:

  1. Throwable.addSuppressed(Throwable異常)
  2. Throwable.initCause(Throwable的原因)

在例外情況,就是suppressedException和事業之間的區別?
我什麼時候會喜歡使用它們中的每一個?

+0

看到這個鏈接https://stackoverflow.com/questions/7849416/what-is-a-suppressed-exception和因爲 – Lokesh

回答

4

被抑制的例外情況是將發生如果另一個異常未發生。我只知道發生這種情況的一種情況,這是與資源嘗試的聲明。 JLS (14.20.3)說:

資源以與它們初始化的順序相反的順序關閉。僅當資源初始化爲非空值時才關閉資源。關閉一個資源時的異常並不妨礙關閉其他資源。如果以前由初始化程序,try塊或資源關閉引發異常,則此例外是被抑制

因此,假設您試圖寫入USB存儲棒上的文件流,並移除了USB存儲棒。 write調用拋出一個IOException - 但調用close也是如此,因爲它試圖刷新緩衝區。來自write呼叫的原始例外將是呼叫者看到的那個例外,但他們將能夠得到close拋出的例外,作爲抑制性例外。

如果異常有一個原因如果它實際上是將一個異常轉換爲另一個異常的結果。假設你正在編寫一個與本地文件系統交談的SQL系統。您的JDBC驅動程序方法只能拋出SQLException,那麼如果您的基礎代碼拋出IOException因爲無法從磁盤中讀取而執行什麼操作?您可能希望IOException的細節在SQLException中可見,因此您將其傳入構造函數SQLException - IOException原因的異常。

你不可能永遠需要自己添加抑制異常,但創建一個由另一個異常(通常通過構造函數而不是調用initCause)引起的異常是相當普遍的。