当前位置: 首页 > 面试题库 >

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

邢项禹
2023-03-14
问题内容

我想捕获一个异常,该异常嵌套在另一个异常中。我目前正在这种方式:

} 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'");
    }
}

有没有一种方法可以使此操作更高效,更优雅?


问题答案:

没有更优雅的方法来选择性地“捕获”嵌套异常。我想如果您做了很多这样的嵌套异常,就可以将代码重构为通用的实用程序方法。但是它仍然不会优雅或高效。

优雅的解决方案是消除异常嵌套。要么不首先将异常链接起来,要么(有选择地)解开包装并将嵌套的异常重新扔到堆栈的上方。

html" target="_blank">嵌套异常的原因有3个:

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

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

  3. 您很懒惰,并且将 各种 无关的异常转换为单个异常,以避免在方法签名1中包含大量已检查的异常。

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

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

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

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

2-请勿将您的API方法更改为throws Exception。这只会使情况变得更糟。现在,您Exception每次调用方法时都必须“处理”或传播。这是癌症…



 类似资料:
  • 问题 你想捕获一个异常后抛出另外一个不同的异常,同时还得在异常回溯中保留两个异常的信息。 解决方案 为了链接异常,使用 raise from 语句来代替简单的 raise 语句。 它会让你同时保留两个异常的信息。例如: >>> def example(): ... try: ... int('N/A') ... except ValueError as e:

  • 例子: 我如何在mockito中执行此操作,并在强制抛出异常1后验证是否得到了异常2?

  • 在尝试我在方法中发现的多捕获特性时,一切都按预期正常工作。

  • 问题内容: 我在Spring中使用javax-validation和hibaernate-validator进行表单验证。除了用于Spring的基本必要JAR文件。 我包括: 验证API-1.1.0.Final hibernate-validator-5.1.0.Final 我读到某处也关注到了spl4j版本:所以我也告诉: 错误原因可以归因于slf4j和log4j兼容性吗? 我使用注释基础验证。

  • 问题内容: 我知道我可以做到: 我也可以这样做: 但是,如果我想在两个不同的异常中做同样的事情,那么我现在想到的最好的方法就是: 有什么办法可以做这样的事情(因为在两个异常中都采取的措施是): 现在,这确实不起作用,因为它与以下语法匹配: 因此,我捕捉两个截然不同的异常的努力并未完全实现。 有没有办法做到这一点? 问题答案: 例如,子句可以将多个异常命名为带括号的元组。 或者,仅对于Python

  • 每当我的VNC连接被终止时(每当我重新启动VM时),我都试图捕捉一个异常,并且我试图忽略它以继续我的Jython脚本。我不知道如何编写try catch语句来捕获异常,因为它起源于Java。这是一个sikuliX脚本。