gpt4 book ai didi

java - HttpURLConnection.getResponseCode() 在代码已知时抛出 IOException

转载 作者:搜寻专家 更新时间:2023-10-30 21:31:04 25 4
gpt4 key购买 nike

为什么即使状态已知,HttpURLConnection.getResponseCode() 也会抛出 IOException

Caused by: java.io.IOException: Server returned HTTP response code: 412 for URL: <my url>

获取响应代码不是问题,因为它写在异常消息中。

我希望有一个选项来获取状态代码(即使它不是 ~200)而不会出现异常,这样我就可以在我的代码中决定要做什么。

完整堆栈跟踪:

Caused by: java.io.IOException: Server returned HTTP response code: 412 for URL: <my url>
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1625)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468)
... my code

更新我更改了服务器端实现以返回不同的状态代码 (303),它现在可以正常工作(不抛出 IOException)。意味着它与 412 具体相关。

最佳答案

我今天在工作中遇到了同样的问题——我们的代码正在调用 HttpURLConnection.getResponseCode() 并以 Caused by: java.io.IOException: Server returned HTTP response code: 400 for URL: ... — 在深入研究 JDK 源代码后,我最终发现了以下内容:

  • getResponseCode() 不是实际上抛出异常!
  • getResponseCode() 内部深处抛出一个异常,但它被捕获了。
    • 在它被捕获之前,一些字段在 HttpURLConnection 中设置,允许 getResponseCode() 成功,它确实如此。
    • 同样在它被捕获之前,异常被保存到 HttpURLConnection 的子类中的一个字段(特别是:sun.net.www.protocol.http.HttpURLConnection.rememberedException ).
  • 随后,我们的代码直接调用了getInputStream()应该在这种情况下抛出异常。 (您应该改为调用 getErrorStream()。)
  • getInputStream() 抛出一个异常,该异常包装原始的抛出并捕获的异常。
  • 因此,我们最终得到了一个带有 Caused by 的堆栈跟踪,它引用了我们调用 getResponseCode() 的代码行,即使我们的实际问题是稍后,在我们直接调用 getInputStream() 的代码行中。
    • 堆栈跟踪提到了后面的代码行,但一开始我没有注意到。

我敢打赌你的情况是一样的。

关于java - HttpURLConnection.getResponseCode() 在代码已知时抛出 IOException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21990677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com