为了账号安全,请及时绑定邮箱和手机立即绑定

如何确定异常处理程序的响应状态?

如何确定异常处理程序的响应状态?

湖上湖 2021-10-20 16:28:39
我在控制器中使用异常处理程序,如下所示:@ExceptionHandler(Exception.class)@ResponseStatus(HttpStatus.CONFLICT)@ResponseBodypublic ApiError handleException(Exception e) {    logger.error("Exception occurred {}", e.getMessage(), e);    return new ApiError(HttpStatus.CONFLICT, e.getMessage());}现在我想根据异常类型选择正确的响应状态。最佳实践中是否有任何关系?现代方法是在任何地方使用运行时异常,所以我不确定4XX对所有运行时异常使用响应代码总是正确的。你能澄清一下吗?聚苯乙烯我明白 4XX 是客户端错误,但 5XX 是服务器错误。
查看完整描述

3 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

你走在正确的轨道上。在我看来,4xx为所有未经检查的异常返回响应代码并不总是正确的。我宁愿将这些异常的定义子集映射到4xx响应代码,其他任何内容都应该是内部服务器错误,因此是500响应代码。


@ResponseStatus(value=HttpStatus.NOT_FOUND)

public class EntityNotFoundException extends RuntimeException {

  // ...

}

@Service如果未找到实体,则可以从带注释的类抛出此异常。对于其他情况,您也可以定义自定义异常。你也可以坚持你@ExceptionHandler,但是你必须自己做映射。

我应该是将异常映射到相关 HTTP 响应代码的好习惯:

  • 错误的请求: 400

  • 未找到: 404

  • 禁止: 403

  • 内部服务器错误: 500

此外,如果您的请求成功,请不要忘记返回以下(或任何其他)响应代码之一。

  • 好的: 200

  • 创建: 201

以上响应代码是常用的。当然,还有更多,但大多数 API 只需要一小部分。通过正确的映射,客户端可以更轻松地了解可能出错(或正确)的内容,然后可以执行进一步的操作或显示客户端所需的信息。例如:

  • 200: 显示成功信息

  • 403: 重定向到登录页面

  • 400: 如果提交了表单,则显示错误

如果出现任何问题,在正文中包含有意义的信息也是一种很好的做法。这也回答了以下问题:“如果我无法将异常映射到现有响应代码,我该怎么办?”。我问过自己同样的问题,答案很简单。尝试将其映射到最接近的响应代码并在正文中包含其他任何内容。

如果客户端缺少参数,您可以使用以下方法:

{ "error" : "Bad Request - Your request is missing parameter 'id'. Please verify and resubmit." }

或者对于上述表单错误(响应代码400):

{ 
    "errors": [ 
           "username": "AlreadyInUse",
    ]}

在返回正文中的信息时,请确保坚持使用一种格式。否则,工作起来很痛苦。


查看完整回答
反对 回复 2021-10-20
?
弑天下

TA贡献1818条经验 获得超8个赞

恕我直言,它不依赖于运行时与检查异常模式,而是依赖于语义正确的区分。

  • 默认情况下,异常类型不反映此语义。

  • 5xx 是在告诉客户您那边出了点问题。

  • 4xx 告诉客户端 API 使用“错误”或未按预期方式使用。

  • 您可以使用运行时或检查异常来实现 4xx 或 5xx 状态代码。这仅取决于您自己的软件架构。

  • 我不会从检查或运行时异常的区别中确定 4xx/5xx(似乎损害了最小惊讶原则 - POLA


查看完整回答
反对 回复 2021-10-20
  • 3 回答
  • 0 关注
  • 181 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信