2021SC@SDUSC
一、@ExceptionHandler 注解
SpringMVC 框架处理异常的常用方式:使用@ExceptionHandler 注解处理异常。
使用注解@ExceptionHandler 可以将一个方法指定为异常处理方法。该注解只有一个可选属性 value,为一个 Class<?>数组,用于指定该注解的方法所要处理的异常类,即所要匹配的异常。
而被注解的方法,其返回值可以是 ModelAndView、String,或 void,方法名随意,方法参数可以是 Exception 及其子类对象、HttpServletRequest、HttpServletResponse 等。系统会自动为这些方法参数赋值。
对于异常处理注解的用法,也可以直接将异常处理方法注解于 Controller 之中。
二、具体实现
1,自定义异常类
定义三个异常类:NameException、AgeException、MyUserException。其中 MyUserException是另外两个异常的父类。
public class MyUserException extends Exception {
public MyUserException() {
super();
}
public MyUserException(String message) {
super(message);
}
}
public class NameException extends MyUserException {
public NameException() {
super();
}
public NameException(String message) {
super(message);
}
}
public class AgeException extends MyUserException {
public AgeException() {
super();
}
public AgeException(String message) {
super(message);
}
}
2,修改 Controller 抛出异常
@Controller
public class MyController {
@RequestMapping(value=" /some.do")
public ModelAndView doSome(Integer age,String name) throws MyUserException{
ModelAndView mv = new Mode1AndView();
if(!"zs".equals(name)){
throw new NameException("姓名不正确!!! ");
}
mv.addobject("myname", name);
mv.addobject("myage",age);
mv.setViewName("show");
return mv;
}
/**定义方法处理异常,在处理器类中定义处理异常的方法*方法的上面加入@ExceptionHanlder*/
@ExceptionHandler(value=NameException.class)
public ModelAndView doNameException(Exception ex){
ModelAndView mv = new Mode1AndView();
mv.addObject("tips","处理NameException");
mv.addobject("ex" ,ex);
mv.setViewName("nameError");
return mv;
}
}
不过,一般不这样使用。而是将异常处理方法专门定义在一个类中,作为全局的异常处理类。
需要使用注解@ControllerAdvice,字面理解就是“控制器增强”,是给控制器对象增强功能的。使用@ControllerAdvice 修饰的类中可以使用@ExceptionHandler。
当使用@RequestMapping 注解修饰的方法抛出异常时,会执行@ControllerAdvice 修饰的类中的异常处理方法。
@ControllerAdvice 是使用@Component 注解修饰的,可以context:component-scan扫描到@ControllerAdvice 所在的类路径(包名),创建对象。
3,定义全局异常处理类
/**@ControllerAdvice:控制器增强,
* 处理器类发生异常可以到当前类中找@ExceptionHandler
* 位置:类的上面
*/
@ControllerAdvice
public class GlobalExceptionResolver {
@ExceptionHandler(value=NameException.class)
public ModelAndView doNameException(Exception ex){
ModelAndView mv = new ModelAndview();
mv.addObject("tips","@ControllerAdvice使用注解处理NameException");
mv.addObject("ex",ex);
mv.setViewName("nameError");
return mv;
}
@ExceptionHandler(value=AgeException.class)
public ModelAndView doAgeException(Exception ex){
ModelAndView mv = new ModelAndview();
mv.addObject("tips","@ControllerAdvice使用注解处理AgeException");
mv.addObject("ex",ex);
mv.setViewName("ageError");
return mv;
}
//处理其他异常,NameException ,AgeException以外的异常@ExceptionHandler
@ExceptionHandler
public ModelAndView doOtherException(Exception ex){
ModelAndView mv = new ModelAndview();
mv.addObject("tips","@ControllerAdvice使用注解处理OtherException");
mv.addObject("ex",ex);
mv.setViewName("otherException");
return mv;
}
}
4,定义 Spring 配置文件
<!--注册组件扫描器
base-package:指定@Controller注解所在的包名
-->
<context:component-scan base-package="com.nurse.controllers"/>
<!--注册组件扫描器
base-package:指定@ControllerAdvice注解所在的包名
-->
<context:component-scan base-package="com.nurse.exceptions"/>
<!--注册注解驱动-->
<mvc: annotation-driven />