用于HTTP错误的Javaexception类是什么?

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

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

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

查看HttpClientexception处理页面

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

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

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

HttpClient让你检查响应代码的原因是因为即使响应代码不是200,响应也可能有用。有些网站在404页面上放置了有用的文本,要么提供对用户有用的东西,要么提供搜索表单,或者只是一个有用的错误消息。 根据您的使用情况,您可能只想显示响应内容而不是抛出exception。

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

快速回答

在Spring,你有你想要的东西:

  • HttpClientErrorException – 收到HTTP 4xx时抛出exception。
  • HttpServerErrorException – 收到HTTP 5xx时抛出exception。

和推荐的做法

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

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

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

所有这些例外都未经检查。