1、springmvc通过HandlerExceptionResolver处理程序的异常,包括Handler映射、数据绑定以及目标方法执行时发生的异常。
2、springmvc提供的HandlerExceptionResolver的常用实现类:
3、DispatchServlet默认装配HanderExceptionResolver
在java中:
@ExceptionHandler({RuntimeException.class})
public ModelAndView handleArithmeticException2(Exception ex) {
System.out.println("出异常了--->:"+ex);
ModelAndView mv = new ModelAndView("error");
mv.addObject("exception",ex);
return mv;
}
@ExceptionHandler({ArithmeticException.class})
public ModelAndView handleArithmeticException(Exception ex) {
System.out.println("出异常了:"+ex);
ModelAndView mv = new ModelAndView("error");
mv.addObject("exception",ex);
return mv;
}
@RequestMapping("/testExceptionHandlerExceptionReslover")
public String testExceptionHandlerExceptionReslover(@RequestParam("i") Integer i) {
System.out.println("result-->"+(10 / i));
return "success";
}
index.jsp
<a href="testExceptionHandlerExceptionReslover?i=10">testExceptionHandlerExceptionReslover</a>
success.jsp
<p>success</p>
error.jsp
<h4>error page</h4>
${exception}
启动服务器之后:
点击:
将I=10改为i=0并刷新:
在控制台可看到:
说明:
(1)在@ExceptionHandler方法的入参中可以加入Exception类型的参数,该参数即对应发生的异常对象。
(2)在@ExceptionHandler方法的入参中不能传入Map,若希望将异常信息传到前端页面上,需要使用ModelAndView。
(3)@ExceptionHandler方法标记的异常有优先级问题。
(4)@ControllerAdvice:如果在当前Handler中找不到@ExceptionHandler方法标记的出现的异常,则会在@ExceptionHandler标记的类中查找@ExceptionHandler标记的方法来处理异常。
比如我们新建一个java文件,在里面加入:
package com.gong.springmvc.test;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
@ControllerAdvice
public class HandleException {
@ExceptionHandler({ArithmeticException.class})
public ModelAndView handleArithmeticException(Exception ex) {
System.out.println("出异常了:"+ex);
ModelAndView mv = new ModelAndView("error");
mv.addObject("exception",ex);
return mv;
}
}
仍可以达到相同的效果。