捕获嵌套到另一个异常中的异常

新手上路,请多包涵

我想捕获一个嵌套到另一个异常中的异常。我目前正在这样做:

 } catch (RemoteAccessException e) {
    if (e != null && e.getCause() != null && e.getCause().getCause() != null) {
        MyException etrp = (MyException) e.getCause().getCause();
        ...
    } else {
        throw new IllegalStateException("Error at calling service 'service'");
    }
}

有没有办法更高效和优雅地做到这一点?

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

阅读 877
2 个回答

没有更优雅的方式来选择性地“捕获”嵌套异常。我想如果你经常捕获这种嵌套异常,你可以将代码重构为一个通用的实用方法。但它仍然既不优雅也不高效。

优雅的解决方案是取消异常嵌套。要么不要首先链接异常,要么(有选择地)解包并重新抛出嵌套的异常到堆栈的更深处。

异常倾向于嵌套有 3 个原因:

  1. 您已确定原始异常的详细信息不太可能对应用程序的错误恢复有用……但您希望保留它们以用于诊断目的。

  2. 您正在实现不允许特定检查异常的 API 方法,但您的代码 不可避免地 会抛出该异常。一个常见的解决方法是将已检查的异常“走私”到未检查的异常中。

  3. 您正在偷懒,将一组 不同 的不相关的异常变成一个异常,以避免在您的方法签名1中有很多已检查的异常。

在第一种情况下,如果您现在需要区分包装的异常,那么您最初的假设是不正确的。最好的解决方案是更改方法签名,这样您就可以摆脱嵌套。

在第二种情况下,您可能应该在控制通过有问题的 API 方法后立即解包异常。

在第三种情况下,您应该重新考虑您的异常处理策略;即正确地做2 。


1 - 事实上,由于在 Java 7 中引入了多异常捕获语法,这样做的半合法原因之一已经消失。

2 - 不要将您的 API 方法更改为 throws Exception 。那只会让事情变得更糟。您现在必须在每次调用这些方法时“处理”或传播 Exception 。这是一种癌症…

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

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