【发布时间】:2015-11-27 23:59:21
【问题描述】:
我在 Google 上搜索了很多,几乎所有我发现的示例都在 Controller 中使用了带有自己的异常处理程序的异常处理。我一直认为这应该在程序的服务层上完成。如果不是,我真的不明白为什么要创建单独的服务层。
另外,如果我在Controller中实现我的异常处理,是否意味着我必须在前面的所有层中抛出异常?
【问题讨论】:
标签: spring spring-mvc exception
我在 Google 上搜索了很多,几乎所有我发现的示例都在 Controller 中使用了带有自己的异常处理程序的异常处理。我一直认为这应该在程序的服务层上完成。如果不是,我真的不明白为什么要创建单独的服务层。
另外,如果我在Controller中实现我的异常处理,是否意味着我必须在前面的所有层中抛出异常?
【问题讨论】:
标签: spring spring-mvc exception
除非您可以从错误情况中恢复,否则您必须让您的异常一直弹出到控制器,以便您可以将它们转换为 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) -> throw new IllegalStateException(e))。
所以它不会变得无用。此外,这一层应该包含所有“业务逻辑”,让 Spring MVC(或任何 Web 框架)控制器只关注 HTTP 内容。
【讨论】: