当前位置: 首页 > 知识库问答 >
问题:

异常已被其他异常错误捕获

晁英彦
2023-03-14

我在Eclipse中尝试Apache HTTP客户端库

<dependency org="org.apache.httpcomponents" name="httpclient" rev="4.3.1"/>  

下面的代码片段检查了异常并需要处理。

 HttpResponse response = httpClient.execute(httprequest);

日蚀给出了3条建议

>

  • Add throws Exception-抛出ClientProtocolException,IOException(工作正常)

    用尝试捕捉包围-

    try {
        HttpResponse response = httpClient.execute(httprequest);
    }
    catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    

    (也工作正常)

    用try/multicatch环绕

    try {
        HttpResponse response = httpClient.execute(httprequest);
    }
    catch (ClientProtocolException | IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    

    第三个选项给出错误

    客户端协议异常已经被替代的IO异常捕获

    我看到了ClientProtocolException的源代码,它IOException。据我所知,在捕获多个异常时,我们可以在更具体的异常下捕获更一般的异常。因此,在捕获IOException之后,我们无法捕获ClientProtocolException

    那么,为什么这种情况会发生在多次尝试捕获中?如果它不被认为是有效的,为什么Eclipse会把这个建议放在第一位呢?

  • 共有3个答案

    谭骏
    2023-03-14

    关于try/multicatch选项#3:ClientProtocolExceptionIOException的子类。由于您希望两者都具有相同的catch块行为,因此无需显式捕获子类类型的异常。任何此类抛出的异常都将被IOException超类捕获。

    这个问题也在这里得到了解答。

    戴霖
    2023-03-14

    人们必须看一看由javac生成的字节码,才能理解为什么会出现编译器错误。

    我修改了您的代码,并添加了一个运行时异常,以便让它编译和分析生成的字节码。

    下面的源代码

    try {
        HttpResponse response = httpClient.execute(request);
    } catch (ClientProtocolException | RuntimeException e) {
        System.out.println("ClientProtocolException and RuntimeException");
    } catch (IOException e) {
        System.out.println("IOException");
    }
    

    会导致这样的字节码

    TRYCATCHBLOCK L0 L1 L2 org/apache/http/client/ClientProtocolException
    TRYCATCHBLOCK L0 L1 L2 java/lang/RuntimeException
    TRYCATCHBLOCK L0 L1 L3 java/io/IOException
    ...
    L2
     FRAME SAME1 java/lang/Exception
     ASTORE 1
    L5
      LINENUMBER 18 L5
      GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
      LDC "ClientProtocolException and RuntimeException"
      INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
    L6
      GOTO L4
    L3
      LINENUMBER 19 L3
      FRAME SAME1 java/io/IOException
      ASTORE 1
    L7
      LINENUMBER 20 L7
      GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
      LDC "IOException"
      INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
    L4
    ...
    

    正如您所看到的,编译器只是生成了一个异常表项(TRYCATCHBLOCK),该表项指向相同的字节代码(L2),以防客户端协议异常运行时异常

    如果你尝试这样做会发生什么

    catch (ClientProtocolException | IOException e)
    

    编译器将不得不生成两个异常表项,它们指向要执行的相同字节代码,并且它们有一个公共层次结构(一个是另一个的子类)。这意味着如果捕获了一个异常,并且jvm试图确定要执行的下一个字节代码,那么两个异常表项将匹配。所以编译器会给你一个错误:异常客户协议异常已经被替代的IOExctive捕获。

    只要删除ClientProcolExctive,因为ClientProcolExctive是一个IOExctive

    吕天逸
    2023-03-14

    代码不应按照JLS进行编译:

    如果类型的并集包含两个选项Di和Dj(i),则这是编译时错误≠ j) 其中,Di是Dj的一个亚型(§4.10.2)。

    通过查看Eclipse的错误列表,有几个与快速修复多捕获方案相关。这看起来像是Bug 388724。

    httpClient。当Eclipse开发人员不考虑测试时,执行抛出两个异常,而只需要抛出<代码> IOExtExo/<代码>。

     类似资料:
    • Twilio新手使用测试帐户。我按照这里列出的安装Twilio PHP的说明进行了安装:https://www.Twilio.com/docs/quickstart/php/sms 因为我得到了一个证书错误,所以我的主机提供程序建议我更改CURLOPT_SSL_VERIFYPEER=>false(从true改为true)。但现在我得到了这个错误。如何修复?:致命错误:未捕获异常“services_

    • imi 框架底层支持将错误转为异常,可以通过 try...catch 来捕获。 默认是不启用的,你可以通过配置来设定错误捕获的等级,并且启用它: 在 config.php 中的 beans 配置 [ 'ErrorLog' => [ 'level' => E_ERROR | E_WARNING | E_PARSE, // 报告 runtime 错误 //

    • 我的RMI服务器接口声明了一个方法foo(),该方法被声明为引发RemoteException和Exception,如下所示: 服务器实现为: 我的客户端在服务器上调用foo: 现在,当我运行客户端时,我得到: 从java类型的foo()中获取异常。rmi。异常异常:未声明的检查异常;嵌套的例外是:java。伊奥。InterruptedIOException:操作超时 Java文档是这样说的。rm

    • 如果这有什么不同的话,我是在运行Java7的OSX10.8上。

    • 目录表 错误 try..except 处理异常 引发异常 如何引发异常 try..finally 使用finally 概括 当你的程序中出现某些 异常的 状况的时候,异常就发生了。例如,当你想要读某个文件的时候,而那个文件不存在。或者在程序运行的时候,你不小心把它删除了。上述这些情况可以使用异常来处理。 假如你的程序中有一些无效的语句,会怎么样呢?Python会引发并告诉你那里有一个错误,从而处理

    • 本节介绍如何使用三个异常处理程序组件(try、catch 和 finally)来编写异常处理程序。 然后,介绍了 Java SE 7中引入的 try-with-resources 语句。 try-with-resources 语句特别适合于使用Closeable的资源(例如流)的情况。 本节的最后一部分将通过一个示例来分析在各种情况下发生的情况。 以下示例定义并实现了一个名为ListOfNumbe