我想捕获一个嵌套到另一个异常中的异常。我目前正在这样做:
} 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 许可协议
没有更优雅的方式来选择性地“捕获”嵌套异常。我想如果你经常捕获这种嵌套异常,你可以将代码重构为一个通用的实用方法。但它仍然既不优雅也不高效。
优雅的解决方案是取消异常嵌套。要么不要首先链接异常,要么(有选择地)解包并重新抛出嵌套的异常到堆栈的更深处。
异常倾向于嵌套有 3 个原因:
您已确定原始异常的详细信息不太可能对应用程序的错误恢复有用……但您希望保留它们以用于诊断目的。
您正在实现不允许特定检查异常的 API 方法,但您的代码 不可避免地 会抛出该异常。一个常见的解决方法是将已检查的异常“走私”到未检查的异常中。
您正在偷懒,将一组 不同 的不相关的异常变成一个异常,以避免在您的方法签名1中有很多已检查的异常。
在第一种情况下,如果您现在需要区分包装的异常,那么您最初的假设是不正确的。最好的解决方案是更改方法签名,这样您就可以摆脱嵌套。
在第二种情况下,您可能应该在控制通过有问题的 API 方法后立即解包异常。
在第三种情况下,您应该重新考虑您的异常处理策略;即正确地做2 。
1 - 事实上,由于在 Java 7 中引入了多异常捕获语法,这样做的半合法原因之一已经消失。
2 - 不要将您的 API 方法更改为
throws Exception
。那只会让事情变得更糟。您现在必须在每次调用这些方法时“处理”或传播Exception
。这是一种癌症…