当前位置:  开发笔记 > 编程语言 > 正文

检查某个异常类型是否是嵌套异常中的原因(原因等等)的最佳方法?

如何解决《检查某个异常类型是否是嵌套异常中的原因(原因等等)的最佳方法?》经验,为你挑选了3个好方法。

我正在编写一些JUnit测试,以验证是否抛出了类型MyCustomException的异常.但是,此异常多次包含在其他异常中,例如在InvocationTargetException中,而InvocationTargetException又包含在RuntimeException中.

什么是确定MyCustomException是否以某种方式导致我实际捕获的异常的最佳方法?我想做这样的事情(见下划线):

try {
    doSomethingPotentiallyExceptional();
    fail("Expected an exception.");
} catch (RuntimeException e) {
     if (!e.wasCausedBy(MyCustomException.class)
        fail("Expected a different kind of exception.");
}

我想避免getCause()深入调用一些"层",以及类似的丑陋工作.有更好的方法吗?

(显然,Spring有NestedRuntimeException.contains(Class),它可以做我想要的 - 但我没有使用Spring.)

CLOSED: 好的,我猜有一个实用方法真的没有绕过:-)感谢所有回复的人!



1> Patrick Boos..:

如果您使用的是Apache Commons Lang,那么您可以使用以下内容:

(1)当原因应完全符合指定类型时

if (ExceptionUtils.indexOfThrowable(exception, ExpectedException.class) != -1) {
    // exception is or has a cause of type ExpectedException.class
}

(2)当原因应该是指定类型或其子类类型时

if (ExceptionUtils.indexOfType(exception, ExpectedException.class) != -1) {
    // exception is or has a cause of type ExpectedException.class or its subclass
}



2> Tom Hawtin -..:

你为什么要避免getCause.当然,您可以自己编写一个执行任务的方法,例如:

public static boolean isCause(
    Class expected,
    Throwable exc
) {
   return expected.isInstance(exc) || (
       exc != null && isCause(expected, exc.getCause())
   );
}


请注意,如果原因具有循环,则此算法可能会导致无限循环,这在某些情况下可能会发生,例如EclipseLink数据库异常.[Apache Commons Lang ExceptionUtils :: getRootCause](https://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/exception/ExceptionUtils.html#getRootCause(java. lang.Throwable))处理这种情况,所以Patrick的答案也可能是`indexOfThrowable`.
然后,一个StackOverflowError,谢谢。无论如何,这与我编写的代码无关。在某些常见的库(包括某些Oracle jdbc驱动程序)中,这是一个问题。这是一个常见的问题,Apache Commons选择在`getRootCause`中处理它,Oracle选择在[printStackTrace](http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6962571)和Guava中处理它。考虑在[Throwables](https://github.com/google/guava/issues/1173)中进行处理。我的评论旨在警告这一点,而不是建议如何最好地构造异常。

3> Mark..:

我认为除了通过getCause层调用之外你别无选择.如果你看一下Spring NestedRuntimeException的源代码,你提到它是如何实现的.

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有