Java异常转译(exception translation)的使用
什么是異常轉譯(exception translation)
在Java中,我們通常使用try-catch語句捕獲異常,進行異常處理。但有些時候,我們使用try-catch捕獲一個異常,但卻不進行異常處理,反而是拋出另一個異常,這就稱為異常轉譯。如下所示,
try {Method(); //某個會拋出Exception1異常的函數 } catch (Exception1 e) {throw new Exception2(); }從上述代碼我們很容易理解異常轉譯這個名字的內涵——將異常Exception1轉譯為Exception2。
為什么要進行異常轉譯
第一次看見這樣的代碼可能會產生疑惑——使用try-catch語句通常是用來捕獲異常并進行處理,但上述代碼卻在捕獲異常后又拋出了另一個異常,既然終究會拋出一個異常,那么何必再多此一舉使用try-catch呢?直接拋出Exception1不好嗎?
這樣做的原因是,在某些時候,高層實現和低層異常之間的關系不明顯,直接拋出低層異常會使調用高層實現的客戶端看到異常時不知所措。
下面用JDK的AbstractSequentialList類中的例子解釋上面抽象的描述。
該類中有一個get方法,其具體實現如下
上述代碼接收一個int型的參數index,返回集合中下標為index的元素。值得注意的是,該函數要求index的值大于等于0,但小于集合中元素的總數。
next()方法的拋出一個NoSuchElementException異常,倘若不使用異常轉譯,調用get方法的客戶端將直接得到一個NoSuchElementException的異常,這樣會使得客戶端對異常產生的原因感到迷惑。通過異常轉譯,使用try-catch捕獲一個NoSuchElementException異常并將其轉換為IndexOutOfBoudsException異常,調用get方法的客戶端看見這個異常,便能很快知道是由于參數index超出了規定的范圍而導致的該異常,一目了然。
一種更加推薦的做法
在上述代碼中,拋出的IndexOutOfBoundsException異常只包含index的信息,一種更加推薦的做法是:
調用構造函數IndexOutOfBoundsException(Throwable cause),將低層的NoSuchElementException異常傳入高層異常IndexOutOfBoundsException。當客戶端調用get方法同時得到一個IndexOutOfBoundsException時,可以調用Throwable的getCause方法得到低層的異常NoSuchElementException。這種保留低層異常的方式能夠為客戶端提供更多的關于異常的信息,方便客戶端找到異常產生的原因。
值得注意的一點
通常我們只使用try-catch捕獲受查異常,但是在異常轉譯中,我們使用try-catch捕獲并轉譯的異常卻沒有這個限制,只要擁有足夠的理由對某個異常進行轉譯,那么即使是RuntimeException,也是可以使用try-catch去捕獲并轉譯的。
(上述例子中轉譯的NoSuchElementException就是一個RuntimeException.)
參考資料
《Effective Java》第三版
總結
以上是生活随笔為你收集整理的Java异常转译(exception translation)的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云队友丨刘润:拼命成长,才不浪费一场危机
- 下一篇: Java编程随机发红包,红包随机算法Ja