1.异常处理的思路
系统中异常包括两类:预期异常和运行时异常 RuntimeException,前者通过捕获异常从而获取异常信息,
后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。
系统的 dao、 service、 controller 出现都通过 throws Exception 向上抛出,最后由 springmvc 前端
控制器交由异常处理器进行异常处理,最终返回一个比较友好的错误提示页面
2.示例
页面
index.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <body> <h2>异常处理</h2> <a href="user/testException">测试异常处理</a> </body> </html> success.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h3>跳转成功</h3> </body> </html> 控制器 @Controller @RequestMapping("/user") public class UserController { @RequestMapping("testException") public String testException() throws Exception{ System.out.println("run testException()..."); //模拟异常 int a = 10/0; return "success"; } }
没有做异常处理,异常会一步一步往上抛,到了浏览器就会出现不友好的页面,页面直接显示错误
想要解决,上面说到,controller向上抛异常给前端控制器没有问题,这里就需要写一个异常处理器组件,并且配置好
三个步骤
1.编写异常类(做提示信息)
public class MyException extends Exception{ private String message; public MyException(String message) { this.message = message; } public void setMessage(String message) { this.message = message; } @Override public String getMessage() { return message; } }
2.编写异常处理类
public class MyExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) { e.printStackTrace(); MyException myException = null; //如果抛出的是自定义异常,则直接转换 if(e instanceof MyException){ myException = (MyException) e; }else{ //如果不是,则重新构造一个自定义异常 myException = new MyException("系统正在维护..."); } ModelAndView mv = new ModelAndView(); mv.addObject("errorMsg", myException.getMessage()); mv.setViewName("error"); return mv; } }
3.配置异常处理器,在springmvc.xml中配置
<!--配置自定义异常处理器--> <bean class="com.cong.exception.MyExceptionResolver" id="myExceptionResolver"></bean>
修改一下控制器
@Controller @RequestMapping("/user") public class UserController { @RequestMapping("testException") public String testException() throws MyException{ System.out.println("run testException()..."); //模拟异常 try { int a = 10/0; }catch (Exception e){ //sprint exception message e.printStackTrace(); //抛出异常 throw new MyException("出现自定义异常..."); } return "success"; } }
错误提示页面
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <html> <head> <title>错误页面</title> </head> <body> <h3>执行出错</h3> ${errorMsg} </body> </html>
结果