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

a76*_*a76 2 spring exception spring-mvc

我用谷歌搜索了很多,几乎所有我发现的例子都在控制器中使用了异常处理和自己的异常处理程序。我一直认为这应该在程序的服务层完成。如果不是,我真的不明白为什么要创建单独的服务层。

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

Cos*_*atu 7

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

由于(例如)“无效输入”必须作为 HTTP 状态代码返回到客户端400 Bad Request,因此显然只有 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)-> throw new IllegalStateException(e))。

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