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

Ste*_*wig 24 java exception http

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

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

asa*_*n74 11

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


Mik*_*eck 9

查看HttpClient异常处理页面

要回答你的问题,虽然似乎有一个org.apache.commons.httpclient.HttpException类可能是一个很好的选择.

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


Pau*_*son 7

快速回答

在春天你究竟你想要什么:

和推荐的做法

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

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

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

所有这些异常都未经检查。


Wen*_*del 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());
}
...
Run Code Online (Sandbox Code Playgroud)

结果样本为:

Exception in thread "main" org.apache.http.client.HttpResponseException: status code: 400, reason phrase: Bad Request
Run Code Online (Sandbox Code Playgroud)