我应该在Spring MVC中将异常处理放在哪里?

时间:2015-11-27 23:59:21

标签: spring spring-mvc exception

我google了很多,几乎所有我发现的例子都在Controller中使用了异常处理程序和自己的异常处理程序。我一直认为这应该在程序的服务层完成。如果没有,我真的不明白创建单独服务层的原因。

另外,如果我在Controller中实现我的异常处理,是否意味着我必须在所有以前的层中抛出异常?

1 个答案:

答案 0 :(得分:4)

除非您可以从错误状态中恢复,否则您必须让异常一直弹出到控制器,以便您可以将它们转换为HTTP错误并将该错误发送回客户端。

由于(例如)“无效输入”必须以400 Bad Request HTTP状态代码返回客户端,显然只有Spring MVC控制器能够做到这一点。

这就是为什么为不同类型的错误定义错误处理方法并将异常映射到状态代码可能是个好主意。这种映射的一个例子是:

  • IllegalArgumentException - > 400 Bad Request
  • IllegalStateException - > 503 Service Unavailable
  • AuthenticationException - > 401 Unauthorized
  • AccessDeniedException|SecurityException - > 403 Forbidden
  • UnsupportedOperationException - > 501 Not Implemented
  • Throwable(其他任何内容) - > 500 Internal Server Error

服务层应该只处理可恢复的异常,它应该将低级别异常转换(包装)到一组明确定义的异常(例如catch (FileNotFoundException e) - > {{ 1}})。

所以它不会变得无用。此外,该层应包含所有“业务逻辑”,并让Spring MVC(或任何Web框架)控制器只关注HTTP内容。