2013-06-27 41 views
4

我不明白何時使用多捕獲。我看到一些編譯多捕獲異常的時間類型的帖子是多個異常類型中最接近的超類型。什麼時候使用try multi catch?

比方說有異常類型A,B和與其最接近的超類型C.

選項1

try{//whatever} 
catch(A|B ex){//whatever} 

選項2

try{//whatever} 
catch(C ex){//whatever} 

選項3

try{//whatever} 
catch(A ex){//whatever} 
catch(B ex){//whatever} 

在哪個理想場合下,我們應該在拋出多個異常時使用上述選項?

+0

不同類型的異常但相同類型的異常可以用更簡單的方式完成 –

回答

7

按照該Oracle documentation,對於新的多catch塊值得注意點是:

catch (IOException|SQLException ex) { 
    logger.log(ex); 
    throw ex; 
} 

如果catch塊處理一個以上的異常類型,然後捕捉參數隱含最終 。在這個例子中,catch參數是最終的,因此你不能在catch塊中爲它分配任何值。通過編譯處理多個異常類型的catch塊生成的字節碼將比編譯每個僅處理一種異常類型的多個catch塊更小(並且因此更好)。處理多種異常類型的catch塊不會在編譯器生成的字節碼中產生重複;字節碼沒有異常處理程序的複製。

如果異常可以不同的方式處理,我相信你應該分開處理它們。如果異常處理對於多重異常相同,那麼您可以使用multi-catch塊。

try{//whatever} 
catch(A ex){//do something specific for A} 
catch(B ex){//do something specific for B} 

try{//whatever} 
catch(C ex){ 
//C is superclass of A and B and you are not concerned about the specific type 
// will catch even other exceptions which are instanceof C 
} 

try{//whatever} 
catch(A|B ex){//do the same thing for both A and B} 
0

當使用每個選項:

選項1:A或B不具有公共超,但代碼來治療他們將是相同的

選項2:A和B有C作爲共同的超類,你只是不介意和對待他們兩個一樣

選項3:一個必須被對待dif不同於B

+1

A或B沒有共同的超類?例外類超A,B –

+0

@SanjayaLiyanage是的,我忘了說A和B不共享相同的祖先時使用選項1,否則可以使用選項2 – morgano

3

選項1:避免重複的代碼,如果AB將以相同的方式處理。

} catch (SSLException | UnknownHostException e) { 
    showErrorPopupAndReturn(); 
} 

選項2:幾乎相同的選項1,但它也將處理的C任何其他亞型,你可能不希望。

} catch (IOException e) { 
    // Almost as Option 1, but will also handle any other subclass of 
    // IOException, e.g. ObjectStreamException 
    doStuff(); 
} 

方案3:你必須做別的事情的時候AB發生。

} catch (UnknownHostException e) { 
    tryAnotherIPaddress(); 
} catch (SSLException e) { 
    reloadCertificate(); 
} 
0

這取決於您如何處理異常。

在情況1中這兩種類型的異常被捕獲並處理

在情況2中它僅捕獲C型和它的子類型的異常和 手柄

在情況3中A和B的類型分開處理。

最終出來的情況1和3都是一樣的。但情況3中的代碼的可理解性或可讀性將增加3

+0

1和2不一樣,因爲2處理'C'的所有子類,1只處理'A'和'B'(及其子類)。 – jlordo

+0

1和3的結果不一定相同,請參閱我的答案中的示例。如果它們是相同的,則代碼可讀性對於選項1會更好(再次,請參閱我的答案)。 – jlordo

相關問題