2016-08-04 101 views
1

我有幾個自定義異常類。 (不同錯誤代碼/錯誤消息) 其中一些導致終止。這就是爲什麼我讓他們傳播到主體。 打印錯誤代碼+消息。擴展異常處理

那我要是追到超,有沒有有長的if else列表來檢查我毫無遺漏了才能到覆蓋方法,其子類的方法嗎?

難道是更具可讀性有幾個catch語句?

我應該投他們在一個較低的水平上一個例外,只有捕獲此異常?

+1

「沒有一個很長的if else列表來檢查哪個子類」您可以使用訪問者(可能) – 2016-08-04 11:18:19

回答

6

如果您需要一種特定的方式來處理SubclassOfException,使用catch SubclassOfException

有在使用instanceof檢查鏈時,這基本上就是異常處理已經這樣做沒有任何意義。

try { 
} catch (SubclassOfException e) { 
    // Do something specific to SubclassOfException 
} catch (Exception e) { 
    // Do something for other types. 
} 

是基本相同:

try { 
} catch (Exception e) { 
    if (e instanceof SubclassOfException) { 
    // Do something specific to SubclassOfException. 
    // Note that you have to cast explicitly if you want to use 
    // subclass-specific properties of SubclassOfException. 
    } else { 
    // Do something for other types. 
    } 
} 

我認爲這是明顯的,首先是更具可讀性,它會得到更有效的執行,因爲這是JVM如何預計的異常處理代碼要寫。

在第一種方式書寫的另一個好處是,你可以不寫:

try { 
    // ... 
} catch (SubclassOfException e) { 
} catch (SubclassOfSubclassOfException e) { 
} 

,因爲第一個catch將捕獲所有異常由第二收集匹配,使得第二收集多餘的。因此,這是一個編譯時錯誤,在JLS Sec 11.2.3描述:

這是一個編譯時錯誤,如果catch子句可以捕獲異常E1級,並立即封閉try語句的前面的catch子句可以捕獲E1或E1的超類。

您需要先捕獲最具體的類型,然後再捕獲最不具體的類型。

在另一方面,

if (e instanceof SubclassOfException) { 
} else if (e instanceof SubclassOfSubclassOfException) { 
} 

是不是編譯時間錯誤,即使第二分支不能執行任一;您只會看到所有SubclassOfSubclassOfException正在處理,就好像它們僅僅是SubclassOfException一樣。

+0

所以我需要先訂購具有最低繼承性的catch塊,或者有沒有辦法說看看基地這個實例的級別? – gismo

+1

@gismo我認爲當你評論這個問題時,我正在編輯的內容是? –