我google了很多,几乎所有我发现的例子都在Controller中使用了异常处理程序和自己的异常处理程序。我一直认为这应该在程序的服务层完成。如果没有,我真的不明白创建单独服务层的原因。
另外,如果我在Controller中实现我的异常处理,是否意味着我必须在所有以前的层中抛出异常?
答案 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内容。