Java SE 7版再添兩種 Exception機制
- 多型別例外捕捉
- 例外重拋型別檢查改進
多型別例外捕捉
所謂多型別例外捕捉是指一次可以針對兩種以上型別捕捉處理
語法
try { // code } catch (Type1|Type2|Type3|... e){ // handle }
與原有的 try...catch 語法差不多
但是 catch部分的捕捉,可撰寫多個型別,以「|」符號分隔
會設計主機制大多是因為
- 需要針對多種例外作相同的錯誤處理
- 這些例外的共同繼承基底距離太遠
(例如,共同基底交集是 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 的拋出列表上
留言列表