【问题标题】:What Java exception class to use for HTTP errors?用于 HTTP 错误的 Java 异常类是什么?
【发布时间】:2008-10-17 13:56:41
【问题描述】:

我正在使用 Apache HttpClient 并希望通过 Java 异常机制将 HTTP 错误(400 错误请求、404 未找到、500 服务器错误等)传达给调用代码。 Java 标准库或广泛使用的库中是否存在适合为此目的使用或子类化的异常?

另一种方法是检查状态返回码。这似乎是 HttpClient 的设计理念,但由于这些错误在我的应用程序中确实是异常的,所以我希望在它们发生时为我设置堆栈跟踪和其他好的异常。

【问题讨论】:

    标签: java http exception


    【解决方案1】:

    如果它不是 HttpClient 设计理念中的异常,而是代码中的异常,则创建自己的异常类。 (作为 org.apache.commons.httpclient.HttpException 的子类)

    【讨论】:

    • 除非你追求速度然后 org.apache.commons.httpclient.HttpException
    【解决方案2】:

    查看Exception Handling for HttpClient上的页面

    要回答您的问题,虽然似乎有一个很合适的 org.apache.commons.httpclient.HttpException 课程。

    如果您确实需要一个自定义异常类,我认为java.io.IOException 将是正确的超类。

    【讨论】:

      【解决方案3】:

      快速解答

      在春天,你有正是你想要的:

      以及推荐的做法

      至少,您应该区分与业务逻辑相关的异常(例如,余额不足、电子邮件地址无效)和其他异常(例如,服务器不可用、不支持的媒体类型、SQLException)。

      在我们的 REST API 中,我们有一个用于 Java 客户端的库,它解析响应并仅抛出三种不同的异常:

      • 400、401、403、404、409、422:抛出MyBusinessException,其中包含可以显示给最终用户的消息。消息来自响应正文(服务端的异常处理),但如果不存在,我们有一个特定于每个状态代码的默认消息。
      • 405, 412, 415:抛出 HttpClientErrorException 并带有特定于每个状态代码的消息。
      • 其他 4xx 代码:抛出 HttpClientErrorException 和一般消息。
      • 5xx 代码:抛出 HttpServerErrorException 并附上一般信息。

      所有这些异常都未选中。

      【讨论】:

        【解决方案4】:

        我想说这取决于您使用 HTTPClient 的目的。例如,PayPal SDK 使用 HttpClient 将 API 调用传输到 PayPal 服务器,但在完成时无法检查 HTTP 响应代码。我修补了我的副本,以便如果响应代码不是 200,它会引发 PayPal FatalException,并带有适当的消息。这是因为调用者对 HTML 或此 HTTP 帖子的任何细节不感兴趣,甚至对我们使用 HTTP 作为传输的事实也不感兴趣。如果调用成功,则响应正文包含事务详细信息,这些详细信息被提取并放入响应对象中;否则它包含无用的 HTML。在这种情况下,HTTP 只是传输,因此某些响应代码表示可以使用异常报告的错误。因为这是 PayPal SDK 的一部分,所以我使用了 PayPal Exception 类。在其他一些系统或库中,我会使用该库已经使用的任何异常的子类型。例如,如果我正在编写一个访问 GMail 帐户的 GMail 库,我可能会创建一个 GMailException 类,并为库遇到的不同类型的异常创建一个子类。或者,您可以使用 IOException 之类的内容。

        HttpClient 让您检查响应代码的原因是因为即使响应代码不是 200,响应也可能有用。一些网站将有用的文本放在 404 页面上,或者为用户提供有用的操作,或者搜索表格,或者只是一个有用的错误信息。根据您的用例,您可能只想显示响应内容而不是抛出异常。

        【讨论】:

          【解决方案5】:

          我在 Apache HTTP Client 4.5.7 上发现了这个异常:

          ...
          import org.apache.http.client.HttpResponseException;
          
          ...
          StatusLine statusLine = response.getStatusLine();
          if(statusLine.getStatusCode() != 200) {
              throw new HttpResponseException(statusLine.getStatusCode(), statusLine.getReasonPhrase());
          }
          ...
          

          结果样本为:

          Exception in thread "main" org.apache.http.client.HttpResponseException: status code: 400, reason phrase: Bad Request
          

          【讨论】:

            【解决方案6】:

            如果你想要一个库异常,有org.apache.commons.httpclient.HttpException。我们有时也会为特定目的创建自己的异常,既为特定 HTTP 状态代码创建异常,又为意外状态代码创建通用异常。

            【讨论】:

            • 你为自己的异常子类化了什么? IOException 似乎是这里的常见建议,但我不相信它是合适的,因为 IO 执行正确,但结果不是调用代码所需要的。
            • HttpException 是 IOException 的子类。 IOException 的缺点是它是一个受检异常。
            猜你喜欢
            • 2018-10-31
            • 1970-01-01
            • 2022-12-12
            • 1970-01-01
            • 1970-01-01
            • 2011-03-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多