我在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会把这个建议放在第一位呢?
关于try/multicatch选项#3:ClientProtocolException
是IOException
的子类。由于您希望两者都具有相同的catch块行为,因此无需显式捕获子类类型的异常。任何此类抛出的异常都将被IOException
超类捕获。
这个问题也在这里得到了解答。
人们必须看一看由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
。
代码不应按照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