用于HTTP错误的Java异常类是什么?

时间:2008-10-17 13:56:42

标签: java http exception

我正在使用Apache HttpClient,并希望通过Java异常机制将HTTP错误(400 Bad Request,404 Not Found,500 Server Error等)传达给调用代码。 Java标准库或广泛使用的库中是否存在异常,以便为此目的使用或子类化?

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

6 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:9)

查看Exception Handling for HttpClient

上的页面

要回答你的问题,虽然似乎有一个org.apache.commons.httpclient.HttpException课程可能不太合适。

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

答案 2 :(得分: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页面上放置了有用的文本,要么为用户提供有用的东西,要么搜索表单,或只是一个有用的错误消息。根据您的使用情况,您可能只想显示响应内容而不是抛出异常。

答案 3 :(得分:4)

快速回答

在春天,你有完全你想要的东西:

推荐做法

最低限度,您应该从其他例外(例如,服务器不可用,不支持的媒体类型,SQLException)区分与业务逻辑相关的例外(例如,余额不足,电子邮件地址无效)。 / p>

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

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

未选中所有这些例外情况。

答案 4 :(得分:2)

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

答案 5 :(得分:0)

我在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