springMVC中的异常处理
一、异常处理的思路
系统异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发,测试手段减少运行时异常的发生。系统的dao、service、controller出现异常都通过throws Exception向上抛出,最后由springMVC前端控制器交由异常处理器进行异常处理。如下图:
二、异常处理的实现步骤
1). 编写异常类和错误页面
- 错误页面error.jsp
<h1>执行失败,错误消息如下:</h1>
${message}
<%-- message从域中取 --%>
- 自定义异常类
public class CustomException extends RuntimeException {
private String message;
public CustomException(String message) {
this.message = message;
}
@Override
public String getMessage() {
return message;
}
}
2). 自定义异常处理器
需要实现HandlerExceptionResolver接口,并配置到容器中
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/** 自定义异常处理器 */
public class CustomExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
Object o, Exception e) {
e.printStackTrace();
CustomException customExeption = null;
/* 如果抛出的是系统自定义异常则直接转换
此处可以根据业务需要根据不同的异常进行相应的逻辑处理*/
if(e instanceof CustomException) {
customExeption = (CustomException)e;
} else {
// 如果抛出的不是系统自定义异常则重新构造一个系统错误异常
customExeption = new CustomException("系统正在升级,请见谅!");
}
// 设置错误消息,底层会将其存放到域中,以便jsp页面使用
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("message", customExeption.getMessage());
// 设置跳转的错误相应页面
modelAndView.setViewName("error");
return modelAndView;
}
}
3). 配置异常处理器
在springMVC.xml中将自定义异常处理器放入容器中;
注意,id值是唯一的,spring底层是这样写的,作为开发者,根据他的要求干就可以了
<!-- 配置异常处理器 -->
<bean id="handlerExceptionResolver"
class="com.itheima.MyException.CustomExceptionResolver"/>
4). 访问异常演示
- 前端index.jsp
<%-- 自定义异常处理 --%>
<a href="${pageContext.request.contextPath}/exception/throwOne">运行期异常</a>
<hr>
<a href="${pageContext.request.contextPath}/exception/throwTwo">自定义异常</a>
- 负责抛异常的控制器
@Controller
@RequestMapping("/exception")
public class ExceptionController {
/** 显示抛出一个错误 */
@RequestMapping("/throwOne")
public String throwExceptionOne() {
throw new RuntimeException("Runtime Exception");
}
/** 抛出一个自定义异常 */
@RequestMapping("/throwTwo")
public String throwExceptionTwo() {
throw new CustomException("我是自定义异常");
}
}