SpringMVC异常处理

描述

在项目开发中,不管是对底层数据库操作过程,还是以业务层的处理过程,以及控制层的处理,都会不可避免的遇到各种预知或不可预知的异常需要进行处理;如果每个异常删除处理,则会造成工作量增大,而且项目维护也不好维护。

所以SpringMVC就提供了统一处理异常的机制。

SpringMVC处理异常的方式

  1. 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver
  2. 自定义异常类,实现Spring的异常接口HandlerExceptionResolver,自己自定义异常处理器。
  3. 使用@ExceptionHandler异常处理器注解,实现异常处理。

实现HandlerExceptionResolver接口,自定义异常类

  • 自定义的异常类

    /**
     * 自定义异常处理类,需要将此类配置到Spring容器
     */
    @Component
    public class MyExceptionDome implements HandlerExceptionResolver {
    
        /**
         *
         * @param httpServletRequest 请求对象
         * @param httpServletResponse 响应对象
         * @param o 产生异常的方法对象,底层类型就是Method类型,只不过Spring进行了封装
         * @param e 具体的异常对象
         * @return
         */
        @Override
        public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
            
            System.out.println("异常处理方法执行...");
    
            //判断异常类型,然后做相应处理
            if (e instanceof ArithmeticException) {
                System.out.println("算数运算异常...");
            }
            //跳转相应错误显示页面
            return null;
        }
    }
    

    只要程序产生异常,都会进入此异常类,Spring通过此类实现的HandlerExceptionResolver接口,就能够知道这是一个异常处理类。

  • 异常方法测试

    /**
     * 异常方法
     */
    @RequestMapping("/demo15")
    @ResponseBody
    public User demo15() {
    	User user = new User("zhangsan", 18);
    	System.out.println("请求方法执行...");
    	//模拟异常
    	int i = 1 / 0;
    	return user;
    }
    
  • 结果

    在这里插入图片描述

  • 注意点

    1. 要将自定义的注解类配置到Spring容器中,进行管理,当程序出现异常的时候,Spring才会调用执行你配置的异常处理类。
    2. 自定义异常类的方式与使用注解方法不能同时使用,会引起冲突。

使用注解方式,实现异常的分类管理

所使用注解
  1. @ControllerAdvice
    • 类型:类注解,作用于类的上方
    • 作用:设置当前类为异常处理类
  2. @ExceptionHandler
    • 类型:方法注解,作用于异常处理类中的方法上,针对指定异常做处理。
    • 作用:设置指定异常的处理方法。
注解配置异常处理类
  1. 异常处理类

    /**
     * 异常处理类
     */
    @ControllerAdvice
    @Component
    public class ExceptionAdvice {
    
        /**
         * 自定义处理指定异常的方法
         * @param e 报错的异常对象
         * @return 异常信息
         */
        @ExceptionHandler(Exception.class) //处理所有异常
    //    @ExceptionHandler(NullPointerException.class)  指定处理空指针异常
    //Exception :异常对象
        @ResponseBody
        public String ExceptionFunction(Exception e) {
            //获取异常消息,并响应给前端
            String message = e.getMessage();
            return message;
        }
    }
    
  2. 模拟异常方法

    @Controller
    public class ExceptionController {
        @RequestMapping("/exception")
        @ResponseBody
        public void findAll() {
            //手动添加一个运行时异常
            throw new RuntimeException("running Exception...");
        }
    }
    
  3. 响应结果

    在这里插入图片描述

两种异常处理方式对比

  1. 注解处理器可以拦截到入参类型转换异常。

  2. 非注解处理器无法拦截到入参类型转换异常。

  3. 入参类型转换异常指的是把请求中的参数,映射到处理方法的形参上,出现的异常。

  4. 入参异常?

    就是将请求中的参数,封装到处理方法的形参时,出现类型转换等异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值