2011-12-22 61 views
0

這是我的情況,我有例外列表中包含不同層次一樣任意例外,和婁代碼卡扣將解釋什麼,我需要做的比較例外

private List<java.lang.Class> connectionExceptions; 
try { 

// trying to connect to external module; 

} catch(Exception e) { 
    // Need to compare this exception e with a list of exceptions which I have, 
    // and the action depends on the results. There may be some other exception 
    // which are not in the list. 
} 

所以,我怎麼能比例外,我需要某種行動,如果例外是在列表中或其他...

我知道,控制流取決於例外是不好的做法。但是,我需要這樣做。

+0

爲什麼不能使用'List ''? – KrishPrabakar 2015-03-09 11:01:00

回答

2

您可以有幾個catch-每個塊只捕獲一個特定的異常。

... 
catch(SomeException e) { 
    //do something 
} 
catch(SomeOtherException e) { 
    //do something else 
} 

或者,真正檢查的例外是在你的列表中,使用connectionExceptions.contains(e.getClass())

+0

如果列表中有不同層次的異常,會發生什麼?..? – 2011-12-22 09:17:04

+0

你是什麼意思? – tobiasbayer 2011-12-22 09:22:30

1
if (connectionExceptions.contains(e) { 
    // 
} 

這就是如果你需要列表是動態的。否則,使用:

} catch (FooException) { 

} catch (BarException) { 

} 

或多漁獲Java7:

} catch (FirstException | SecondException ex) { 
+0

哎呀,是的。定影。我期望它實際上是'Class',它更有意義 – Bozho 2011-12-22 09:24:47

+0

@Bozho:我已經更新了這個問題,謝謝你的建議。 – 2011-12-22 09:34:44

+0

我猜'Exception'沒有一個正確的重寫'equals()'方法,導致它使用超類'Object'的等號使用了身份比較('==')。 – KrishPrabakar 2015-03-09 10:59:15

-1

Abimaran,你的問題是「檢查異常(在try塊拋出)是否在你的名單或不是」。因此,爲了檢查這,檢查機制應該是非常簡單或詳細的,我的意思是,

  • 維護列表,地圖或每個異常的詳細(如 如果POSS膽汁,類型,等級等任何東西的例外)
  • 當您檢查catch塊中的異常時,只需使用由Java通用類提供的一些 函數。

這是你可以爲這種情況做的最好的。

2

由於Exception類使用equals()方法Object類的功能,connectionExceptions.contains(e)不會產生一個正確的答案,因爲每個例外五實例軸承相同原因和堆棧跟蹤將具有不同的默認HEX身份。但是,如果您想要比較兩個例外,則可以使用Arrays.deepEquals(Object, Object)

catch (Exception e) { 
    boolean sameException = false; 
    for (Exception ee : connectionExceptions) { 
    sameException = Arrays.deepEquals(e.getStackTrace(), ee.getStackTrace()); 
    if (sameException) { 
     break; //exception matched 
    } 
    } 
} 
+0

請提供一些解釋,爲什麼'Arrays.deepEquals()'應該優先於'Arrays。等於()' – coolguy 2016-06-21 10:00:44

0

Peter Knego解釋瞭如何比較answer中的例外情況。

基本上,您可以使用instanceof進行比較。

for (java.lang.Class exception : connectionExceptions) { 
    if (e instanceof exception) { 
     // DO YOUR THING 
     break; 
    } 
}