2011-12-22 64 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; 
    } 
}