软件工程应用与实践(11)——控制层之异常处理

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 />
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值