框架异常处理模式:
控制器中把异常抛给框架,框架捕获异常,把捕获的异常交给异常处理器对象。
异常处理器对象是框架中的特定的一些类,可以处理异常
异常处理器必须实现HandlerExceptionResolver接口:异常处理器有框架自己实现的,也可以开发人员自定义实现
SpringMVC常用的异常处理方式:
1.自定义异常处理器,自己实现HandlerExceptionResolver接口
2.使用框架中的注解:@ExcptionHandler
- 自定义异常处理器(配置式)
步骤:1.新建类实现HandlerExceptionResolver接口,重写接口中的函数,实现异常的处理逻辑
2.在SpringMVC的配置文件中声明自定义异常处理器
- 项目目录:
注意:exception目录下的文件都继承Exception并实现它的有参构造和无参构造
- 在SpringMVC核心配置文件:
<!--声明自定义异常处理器-->
<bean class="com.bjpowernode.handle.CustomExceptionHandler"/>
- Controller层:
@RequestMapping(value = "/Exception.do")
public ModelAndView toException(String name,String age)
throws NameException,AgeException{
ModelAndView mv=new ModelAndView();
if(name==null||"".equals(name)) {
throw new NameException("名字不能为空");
}else if("".equals(age)||age==null||"80".equals(age)){
throw new AgeException("输入年龄有误");
}else{
mv.setViewName("show");
}
return mv;
}
- SpringMVC的异常处理器:
public class CustomExceptionHandler implements HandlerExceptionResolver {
/**由于该类实现了HandlerExceptionResolver所以该类就是异常处理器
* 在SpringMVC中只有异常处理器对象才能处理异常
* 当处理器中抛出异常后,SpringMVC能够捕获异常,调用所有的实现了HandlerExceptionResolver类的
* 执行类中的resolverException(),由这个函数处理异常
* resolverException()函数异常处理结果就是用户看到的异常
*
* 参数中的handler代表处理器对象(发生异常的处理器对象)
* */
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
Object handler, Exception e) {
ModelAndView mv=new ModelAndView();
mv.addObject("Exception",e);
if(e instanceof NameException){
mv.addObject("tips","名称不能为空");
mv.setViewName("nameError");
}else if(e instanceof AgeException){
mv.addObject("tips","输入年龄有误");
mv.setViewName("ageError");
}else{
mv.addObject("tips","请求超时,请重试!");
mv.setViewName("defaultError");
}
return mv;
}
}
- 自定义异常处理器(注解式):
- 项目目录:
- springmvc.xml文件:
<!--指定@ControllerAdvice注解的包名-->
<context:component-scan base-package="com.bjpowernode.handle"/>
<!--添加注解驱动-->
<mvc:annotation-driven/>
- GloalExceptionHandler文件:
/**@ControllerAdvice:处理器增强,目的就是给controller类增强功能
* 类类似于AOP思想,常见的是增强异常处理功能
* */
@ControllerAdvice
public class GloalEceptionHandler {
/**@ExceptionHandler:说明函数是异常的
* 属性value:异常类的class,表示处理的异常类型当
* 这个异常发生时有当前函数处理
* 位置:函数的上面
* */
@ExceptionHandler(value = NameException.class)
public ModelAndView doNameException(Exception ex){
ModelAndView mv=new ModelAndView();
mv.addObject("tips","使用注解处理name异常");
mv.addObject("Exception",ex);
mv.setViewName("nameError");
return mv;
}
@ExceptionHandler(value = AgeException.class)
public ModelAndView doAgeException(Exception ex){
ModelAndView mv=new ModelAndView();
mv.addObject("tips","使用注解处理age异常");
mv.addObject("Exception",ex);
mv.setViewName("ageError");
return mv;
}
/**
* 当@ExceptionHandler处理其他异常的时候不需要value属性
* */
@ExceptionHandler
public ModelAndView doOtherException(Exception ex){
ModelAndView mv=new ModelAndView();
mv.addObject("tips","使用注解处理Other异常");
mv.addObject("Exception",ex);
mv.setViewName("defaultError");
return mv;
}
}