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

我在控制器中使用异常处理程序,如下所示:


@ExceptionHandler(Exception.class)

@ResponseStatus(HttpStatus.CONFLICT)

@ResponseBody

public ApiError handleException(Exception e) {

    logger.error("Exception occurred {}", e.getMessage(), e);

    return new ApiError(HttpStatus.CONFLICT, e.getMessage());

}

现在我想根据异常类型选择正确的响应状态。最佳实践中是否有任何关系?


现代方法是在任何地方使用运行时异常,所以我不确定4XX对所有运行时异常使用响应代码总是正确的。


你能澄清一下吗?


聚苯乙烯

我明白 4XX 是客户端错误,但 5XX 是服务器错误。


湖上湖
浏览 189回答 3
3回答

largeQ

你走在正确的轨道上。在我看来,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",     ]}在返回正文中的信息时,请确保坚持使用一种格式。否则,工作起来很痛苦。

弑天下

恕我直言,它不依赖于运行时与检查异常模式,而是依赖于语义正确的区分。默认情况下,异常类型不反映此语义。5xx 是在告诉客户您那边出了点问题。4xx 告诉客户端 API 使用“错误”或未按预期方式使用。您可以使用运行时或检查异常来实现 4xx 或 5xx 状态代码。这仅取决于您自己的软件架构。我不会从检查或运行时异常的区别中确定 4xx/5xx(似乎损害了最小惊讶原则 - POLA)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java