前言
项目中当出现异常并往外抛出后,如果最后一层接收的是 springmvc 前端控制器DispatcherServlet,那么届时就会显示在页面上,如下图,因此在这一层交由springmvc的异常处理器来接收,并显示自定的内容。
一、配置步骤
1.自定义异常
public class MyException extends Exception{
private String message;
@Override
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public MyException(String message) {
this.message = message;
}
}
2.配置异常处理器
需要实现springmvc提供的接口HandlerExceptionResolver
public class ExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
ModelAndView mv = new ModelAndView();
if(ex instanceof MyException){
ex = (MyException)ex;
}else {
ex = new MyException("系统正在维护");
}
//这个跟servlet的request作用域的意义一样,存入后,可以在jsp中用EL表达式取出指定的值
mv.addObject("wrong",ex.getMessage());
//这是设定跳转的页面,由于我的InternalResourceViewResolver视图解析器配置
mv.setViewName("wrong");
return mv;
}
}
错误返回的页面
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<body>
<h3>请求失败</h3>
<h4>${wrong}</h4>
</body>
</html>
springmvc配置文件中添加该异常处理器
<bean id="myException" class="com.mediacomm.exception.ExceptionResolver"></bean>
3.获取异常或默认异常处理器输出
@RequestMapping(path = "/exception")
public String handleException() throws MyException {
try {
int i = 1/0;
} catch (Exception e) {
e.printStackTrace();
throw new MyException("代码写错了......");
}
return "success";
}
@RequestMapping(path = "/second")
public String getString(@CookieValue(value="JSESSIONID",required=false)String cookie){
System.out.println("cookie="+cookie);
int i = 1/0;
return "success";
}
二、测试
<a href="first/exception">异常的请求</a><br>
<a href="first/second">cookie请求</a><br>