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

新手上路,请多包涵

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

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


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

我想避免调用 getCause() 一些“层”深,以及类似的丑陋解决方法。有更好的方法吗?

显然,Spring 有 NestedRuntimeException.contains(Class) ,它可以满足我的要求——但我没有使用 Spring。

原文由 Yang Meyer 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 516
2 个回答

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

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

原文由 Tom Hawtin - tackline 发布,翻译遵循 CC BY-SA 2.5 许可协议

如果您使用的是 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
}

原文由 Patrick Boos 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题