close

Java SE 7版再添兩種 Exception機制

  • 多型別例外捕捉
  • 例外重拋型別檢查改進

型別例外捕捉

所謂多型別例外捕捉是指一次可以針對兩種以上型別捕捉處理

語法

try {
    // code
} catch (Type1|Type2|Type3|... e){
    // handle
}

與原有的 try...catch 語法差不多

但是 catch部分的捕捉,可撰寫多個型別,以「|」符號分隔

 

會設計主機制大多是因為

  1. 需要針對多種例外作相同的錯誤處理
  2. 這些例外的共同繼承基底距離太遠
    (例如,共同基底交集是 Exception 或 Throwable )

以原有機制,只能撰寫如下

try {
    // code
} catch(Type1 e){
    // handle of Type1, Type2, Type3 ...
} catch(Type2 e){
    // handle of Type1, Type2, Type3 ...
} catch(Type3 e){
    // handle of Type1, Type2, Type3 ...
} .....

除了開發者撰寫麻煩

編譯器可能也會產生許多重複的程式碼

因此針對此種情形改進


 

例外重拋型別檢查改進

有很多情況,例外處理之後會再次重新拋出

要讓執行鏈的多個層級能夠執行各自的錯誤處理

同樣的問題,如果多種型別需要作相同的處理

可以用上述的多型別例外捕捉

如果例外的親戚關係其實很近

或是要寫的型別實在太多了 ( 那就寫天吧 )

大可以使用基底概括

例如官方文件中,以 Exception 基底囊括處理

但是這樣的情況 method 要拋出的型別就很困擾了

通常開發者會希望在 method上清楚註明會拋出哪些例外

可是因為重拋的型別被限制在 Exception

而導致 method 註明的例外也被限制為 Exception

這樣捕捉此 method 拋出的例外

也沒辦法針對特定型別的例外來作處理

 

因此 Java 編譯器提升了自己

在這樣的情況下

只要能夠確定 try...catch敘述捕捉到的例外只有特定型別時

就允許開發人員清楚註明例外的型別

針對該 try...catch敘述,Java 編譯器的判斷條件如下:

  • try 拋出的例外完全包含於 method 拋出例外的列表中
    如果 try 也有拋出其他例外
    但是這些例外都已經被其他 catch處理掉時也可以

  • catch 區塊當中不得更改例外變數的 refernce
    即,不得有針對例外變數的指派 (assign) 命令
    因為只要包含了指派,編譯器就不能確定
    到底新指派的例外物件是從哪裡來的
    要逐一檢查幾乎是不可能

滿足上述的兩個條件,來源確定與來源固定

Java 編譯器就能夠100%確定

捕捉基底型別的 catch 區塊所捕到的,只有特定的型別

那麼開發人員就可以將 Java 編譯器確定的型別

撰寫在 method 的拋出列表上

arrow
arrow
    全站熱搜

    wylokgo101 發表在 痞客邦 留言(0) 人氣()