注意几个细节:
1. 如何将异常信息返回到页面上呢?
尝试将异常信息装入map,再次请求
发现,异常处理方法不好使了
2. 在@ExceptionHandler注解的方法入参中可以加入Exception类型的参数,该参数即对应发生的异常对象
3. @ExceptionHandler方法的入参中不能传入map,若希望把异常信息传到页面上,需要使用ModelAndView作为返回值
改造处理:
error.jsp中加入spel表达式:
${exception}
控制器:
@ExceptionHandler({ArithmeticException.class})
public
ModelAndView handleArithmeticException(Exception
ex){
System.out.println(“出异常了:“+ex);
ModelAndView mv=new ModelAndView(“error”);
mv.addObject(“exception”,ex);
return
mv;
}
4. @ExceptionHandler标记的方法优先级问题
在controller中写了两个处理异常的方法,当发生异常时,优先被和异常最近的方法处理
@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;
}
5. 以上处理的都是一个局部handler的异常,如何配置全局的呢?
将控制器中的异常处理方法全部注释掉,这样就在当前的Handler中找不到@ExceptionHandler标记的可处理异常的方法,那么就去@ControllerAdvice
标记的类中找@ExceptionHandler标记的方法来处理异常
例如:新建一个类,在类中写上异常处理方法
用@ControllerAdvice标记类,注册到spring容器中
@ControllerAdvice
public
class HandlerException {
@ExceptionHandler({ArithmeticException.class})
public ModelAndView handleArithmeticException(Exception
ex){
System.out.println(“—->出异常了:“+ex);
ModelAndView mv=new ModelAndView(“error”);
mv.addObject(“exception”,ex);
return
mv;
}
}
结果:加入控制器增强处理后,可以处理controller中抛出的异常了