SpringMVC自定义异常处理器(配置式、注解式)

框架异常处理模式:
控制器中把异常抛给框架,框架捕获异常,把捕获的异常交给异常处理器对象。
异常处理器对象是框架中的特定的一些类,可以处理异常
异常处理器必须实现HandlerExceptionResolver接口:异常处理器有框架自己实现的,也可以开发人员自定义实现
SpringMVC常用的异常处理方式:
1.自定义异常处理器,自己实现HandlerExceptionResolver接口
2.使用框架中的注解:@ExcptionHandler

  • 自定义异常处理器(配置式)

步骤:1.新建类实现HandlerExceptionResolver接口,重写接口中的函数,实现异常的处理逻辑

2.在SpringMVC的配置文件中声明自定义异常处理器

  • 项目目录:
    SpringMVC自定义异常处理器(配置式、注解式)_第1张图片

注意: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自定义异常处理器(配置式、注解式)_第2张图片

  • springmvc.xml文件:

    <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;
    }
}

你可能感兴趣的:(Spring,JAVA,java,spring,接口,mybatis)