通过Spring MVC 可以通过如下方式对异常进行处理 :
- 通过
@ExceptionHandler指定某类异常被特定的控制器处理方法处理;
该异常处理控制其处理方法又可以分几种情况 :- 不再抛出该异常,自身逻辑处理异常,直接写
response对象输出异常信息;全处理
- 不再抛出该异常,自身根据异常相应返回一个
View/ModelAndView交由框架渲染异常信息到response;全处理
- 不再抛出该异常,自身逻辑根据异常信息执行了一些逻辑,并相应地调用
response.sendError;半处理
- 继续抛出异常,自身可能对异常信息做了某些记录,不过仍然继续抛出该异常;
未处理
- 不再抛出该异常,自身逻辑处理异常,直接写
- 通过
SimpleMappingExceptionResolver指定处理异常的视图;全处理
- 使用注解
@ResponseStatus注解异常;半处理
- 不再继续抛出该异常,而是相应地调用
response.sendError
- 不再继续抛出该异常,而是相应地调用
上面Spring MVC 的异常处理机制,总结来看,有三种处理情况 :
- 全处理
- 半处理
- 未处理
业务请求过程中出现异常的话,Spring MVC 会首先尝试使用上面所提到的机制处理该异常。然后 :
- 如果该异常能被以上机制全处理,相应的响应结果会直接返回给请求者,请求处理结束;
- 如果该异常被以上机制半处理,也就是说,逻辑遇到异常时捕获了异常,相应地调用了
response.sendError,然后控制权返回Servlet容器,此时Servlet容器会尝试根据response.sendError设置的status/reason寻找相应的错误处理页面,重新发起(forward)一个错误页面请求; - 如果该异常未被以上机制处理,也就是说被继续抛出直到
Servlet容器,Servlet容器会捕获该异常找到对应的错误处理页面,否则同样调用跟response.sendError类似的逻辑设置状态字为500,然后接下来,根据所设置的status/eason寻找相应的错误处理页面,重新发起(forward)一个错误页面请求;
代码附件
Tomcat中遇到请求处理异常时调用response.setError的有关逻辑
// 这是 Servlet 容器 Tomcat 遇到请求处理过程中的异常时,所做的反应,
// 这是类 StandardWrapperValve 的代码片段
private void exception(Request request, Response response,
Throwable exception) {
request.setAttribute(RequestDispatcher.ERROR_EXCEPTION, exception);
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
response.setError();
}
Tomcat Response提供给调用者使用的response.sendError的逻辑实现
// 这是 Tomcat 中 Response类 的代码实现片段
@Override
public void sendError(int status, String message) throws IOException {
if (isCommitted()) {
throw new IllegalStateException
(sm.getString("coyoteResponse.sendError.ise"));
}
// Ignore any call from an included servlet
if (included) {
return;
}
setError();
getCoyoteResponse().setStatus(status);
getCoyoteResponse().setMessage(message);
// Clear any data content that has been buffered
resetBuffer();
// Cause the response to be finished (from the application perspective)
setSuspended(true);
}
注意以上两端代码的相同之处:都会对响应对象调用#setError,#setStatus方法。
本文详细解析了SpringMVC框架中的异常处理机制,包括@ExceptionHandler、SimpleMappingExceptionResolver及@ResponseStatus注解的使用,阐述了全处理、半处理与未处理三种异常处理情况,并分析了Tomcat中异常处理的具体流程。
560

被折叠的 条评论
为什么被折叠?



