异常的Http状态代码

时间:2018-01-07 17:28:02

标签: java spring http spring-boot

我有一个SpringBoot控制器,我想为异常返回正确的http代码状态。所以,我的问题是:哪个http statu代码更适合Exception“500”或“409”?

这是我的代码:

@PostMapping(value = {"", "/"})
public ResponseEntity<Response> create(@RequestBody StudioDto studioDto,
        ServletRequest servletRequest, ServletResponse servletResponse) {

    Response response = new Response();

    try {
        studioService.createStudio(studioDto);
        response.setMessage("The studio was create");
        response.setStatusCode(HttpServletResponse.SC_CREATED);

    } catch (Exception e) {
        response.setMessage("Op we have a little problem");
        response.setErrorMessage(e.getMessage());

        //Which one
        //this one 5xx
        response.setStatusCode(500);
        //Or this one 4xx
        response.setStatusCode(409);
    }

    return new ResponseEntity(response, response.getHttpStatus());
}

4 个答案:

答案 0 :(得分:5)

托德给了一个很棒的链接。这是一种更好的思考方式:

  

https://httpstatuses.com/

     
      
  • 1××信息

  •   
  • 2××成功

  •   
  • 3××重定向

  •   
  • 4××客户端错误* 400错误请求* 401未经授权   ... * 405方法不允许   ...

  •   
  • 5××服务器错误* 500内部服务器错误* 501未实现* 502错误网关...

  •   

换句话说,每个主要数字(200,400,500等)都是 CATEGORY 。您可以通过选择“类别”中的特定错误来“优化”错误代码。

原来的问题:

  • 如果客户请求为“错误”(例如,非法用户名/密码),则返回4xx。

  • 如果服务器以某种方式失败(例如,您无法读取数据库),则返回5xx。

HTTP错误代码的“官方”列表是RFC 7231:

https://tools.ietf.org/html/rfc7231

答案 1 :(得分:2)

这取决于您要传达的信息。将状态代码视为调用者下一步操作的指导。如果内部服务器错误导致用户无法执行任何操作,则a 500错误是合适的。

  

服务器遇到意外情况,无法完成请求。

另一方面,a 409表示用户可以在概念上解决的冲突:

  

由于与目标资源的当前状态冲突,无法完成请求。此代码用于用户可能能够解决冲突并重新提交请求的情况。

大多数400级错误表明用户理论上可以修复它们并重新提交。

就个人而言,我建议您捕获更准确的异常并确定每个应返回的状态代码,因为它实际上取决于您的用例。截至目前,您正在抓住Exception,这可能只是关于任何事情,因此很难说出应该给调用者提供哪种指导。

答案 2 :(得分:2)

这不是处理异常的推荐方法,你应该使用控制器建议,检查这个link

状态代码由特定方案定义,500表示内部服务器错误,我将用于未指定其原因的问题,对于409,它会在目标资源上发生冲突

  

由于与当前的冲突,请求无法完成   目标资源的状态。此代码用于以下情况   用户可能能够解决冲突并重新提交   请求

你有很多其他适用于不同情况的状态代码,所以我会说没有具体的状态代码是正确答案,你可以查看link以获取更多信息

答案 3 :(得分:1)

5.XX代码表示来自服务器端的错误,4.XXX代码表示来自客户端的错误 在这里您可以捕获任何异常:

max-width

所以显然不可能知道问题是来自客户端请求(例如,错误的参数)还是来自服务器错误(例如DB或编程错误中的不一致)。

为了能够精确设置4.XXX或5.XXX,您的代码可能依赖于某些特定的基本例外 catch (Exception e) { response.setMessage("Op we have a little problem"); response.setErrorMessage(e.getMessage()); //Which one //this one 5xx response.setStatusCode(500); //Or this one 4xx response.setStatusCode(409); } ClientErrorException

根据错误原因抛出一个或另一个,然后您可以依赖它们来设置正确的状态代码:

ServerErrorException

另一种方法是在异常基类中添加状态代码字段 你可以这么简单地写:

try {
    studioService.createStudio(studioDto);
    response.setMessage("The studio was create");
    response.setStatusCode(HttpServletResponse.SC_CREATED);
} 
 catch (ClientErrorException e) {
    response.setStatusCode(409);
}
catch (ServerErrorException e) {
    response.setStatusCode(500);
}

当您在客户端请求(try { studioService.createStudio(studioDto); response.setMessage("The studio was create"); response.setStatusCode(HttpServletResponse.SC_CREATED); } catch (MyRestException e) { response.setStatusCode(e.getStatusCode()); } )中检测到错误时,可能会直接从您的代码中抛出这些自定义异常。
通过这种方式,您可以将所有其他异常视为与服务器处理相关(4.XXX) Spring异常处理程序可以轻松执行此任务。