2009-01-26 131 views
6

我正在使用反射將某些數據添加到第三方庫中某個類的私有變量中。一路上有大約四種不同的異常可以拋出;所有這些都與思考有關,並且它們都不太可能發生。我對所涉及的類和變量的名稱進行了硬編碼。我不太可能會收到任何未找到的課程或找不到任何字段未找到的錯誤,除非圖書館有一天會升級併發生顯着變化。捕獲幾個異常並重新拋出一個常規異常

我寧願不聲明這四個例外,以便我的調用者處理。他很可能永遠不會看到他們。我想抓住所有這些,並拋出另一個異常來說:「發生了Java反射錯誤;很可能庫已經升級並以與此方法不兼容的方式進行更改。」有沒有可以拋出的標準Java異常,表示只是一般反射錯誤?我應該定義自己的?或者最好只聲明這個方法可以拋出所有可能的反射異常?

回答

2

如果您從不指望它們發生,您可以將所有異常轉換爲AssertionError。 如果要處理特定的異常,可以解開InvocationTargetException。 如果你想扔的方法,而不是的InvocationTargetException您可以使用這一招拋出的實際的異常,但它可能會比有用更混亂

} catch (InvocationTargetException e) { 
    // Throw any exception in the current thread (even if it is a checked exception) 
    Thread.currentThread().stop(e.getCause()); 
} 
+1

爲什麼不只是拋出e.getCause()? Thread.stop()是矯枉過正並且已被棄用 – 2009-01-27 01:22:17

+1

你試過了嗎? e.getCause()返回一個Throwable。如何拋出Throwable而不必聲明它? – 2009-01-29 07:25:02

6

我通常會問自己這些問題:

  • 任何人可以調用此方法,不同的方式處理這些不同的異常類型?
  • ...或者他們會一樣對待他們嗎?
  • 調用者/用戶是否可以從此錯誤中恢復?

如果調用代碼是有可能把這些異常是相同的(如不可恢復的錯誤)的所有四個,那麼它絕對是有道理的捕捉到每個人,並重新拋出一個更一般的(單)例外。如果這樣做,請確保將生成的異常作爲內部異常附加,以幫助在另一端進行任何調試或故障排除。

2

關於檢查與未檢查的異常存在一些爭議。我個人認爲檢查異常是Java中最糟糕的主意 - 但這只是一個觀點(但我並不是一個人認爲)

無論如何,我認爲重要的是要將它們更改爲單個未經檢查的異常。通常我會使用像IllegalStateException或IllegalParameterException這樣的單獨一個 - 具有明確的文本描述,這兩個例外覆蓋了可能會出錯的方法的90%。

0

我認爲在這種情況下聲明異常是不合理的。 所以我會從反射中捕獲異常,也許記錄一個堆棧跟蹤,並拋出一些RuntimeException,它具有不需要聲明的優點。 如果你懶惰,你可以使用RuntimeException和合適的消息。

2

首先,不使用反射,除非你真的要,因爲它是邪惡的。假設您必須:

由於您正在對所有名稱進行硬編碼,因此它僅保留Method.invoke,Constructor.newInstanceField.get/set。我建議你重新拋出你可以處理的檢查異常,包裝在Error。他們不應該發生,如果你想處理它,我建議在課堂入學時間進行檢查。 InvocationTargetException當然應該以適當的方式解開並處理(對包含的方法/構造函數未聲明的檢查異常拋出Error)。

1

如何具有從GeneralException和捕獲擴展那些異常類, GeneralException?

我現在就試試吧! :)