美文网首页
Spring Spring Boot 实战,- 全局异常处理

Spring Spring Boot 实战,- 全局异常处理

作者: 郝小永 | 来源:发表于2019-03-11 20:13 被阅读0次

    异常处理

    当我们开发过程中或者说一个web程序在运行中,由于用户操作不当,或者说程序中存在的bug,有大量的异常需要处理,有些异常要告知开发人员,有些异常要提示用户,

    在很久之前我们处理全局异常通常都定义一个异常基类,然后每个Controller去继承这个异常基类,虽然这种方式可以解决问题,但是极其不灵活,因为动用了继承机制就只为获取一个默认的方法,这显然是不好的。

    在探寻spring的异常处理机制的时候发现@ExceptionHandler注解来处理异常,下面就介绍一下这种方式:

    1,自定义一个异常类并继承RuntimeException

    public class CustomizeException extends RuntimeException {
    
    
        private String content;
    
    
        public CustomizeException() {
        }
    
        public CustomizeException(int code, String msg) {
            JSONObject returnJson = new JSONObject();
            returnJson.put("code", code);
            returnJson.put("msg", msg);
            this.setContent(returnJson.toJSONString());
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    }
    
    

    2,定义一个全局的异常处理类

    @ControllerAdvice
    public class GlobalExceptionHandler {
    
        /**
         * 处理系统异常
         *
         * @param ex
         * @return
         */
        @ExceptionHandler(value = Exception.class)
        @ResponseBody
        public String systemErrorHandler(Exception ex) {
            RespInfo respInfo = new RespInfo();
            respInfo.setCode(400);
            respInfo.setMsg("系统异常");
            respInfo.setData(ex.getMessage());
            return JSONObject.toJSONString(respInfo);
        }
    
        /**
         * 处理自定义异常
         */
        @ExceptionHandler(value = CustomizeException.class)
        @ResponseBody
        public String customizeException(CustomizeException ce) {
           return ce.getContent();
        }
    }
    

    所谓加强Controller就是@ControllerAdvice注解,这中处理异常的方式也叫使用加强Controller做全局异常处理。

    @ExceptionHandler中的value值就是需要异常类(自定义异常(CustomizeException),系统异常(Exception,NullPointerException,ArrayIndexOutOfBoundsException等等..))

    定义一个RespInfo

    用于接收系统异常参数

    public class RespInfo {
    
        public int code;
    
        public String msg;
    
        public Object data;
        
        //省略 get和 set 方法
    }
    

    定义一个Controller

    @RestController
    @RequestMapping(value = "login")
    public class LoginController {
    
        @RequestMapping(value = "in")
        public String login(@RequestBody Parameter parameter) {
    
            if (StringUtils.isAnyBlank(parameter.getPassword(), parameter.getPhone())) {
                throw new CustomizeException(1001, "必要参数不能为空");
            }
            //int i = 1 / 0;
    
            if (!"1111".equals(parameter.getPhone()) || !"1234".equals(parameter.getPassword())) {
                throw new CustomizeException(1002, "参数错误");
            }
            return "登录成功";
        }
    }
    

    其中Parameter是要用户传过来的参数;

    StringUtils.isAnyBlank(CharSequence... css)依赖于:

     <dependency>
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-lang3</artifactId>
       <version>3.7</version>
     </dependency>
    

    任意一个值为空都返回true,

    接下来我们进行测试

    当有空参的时候:

    image.png

    当参数值不正确时:

    image.png

    当发生代码有异常时:

    我们把 int i = 1 / 0 注解打开,

    image.png

    代码地址: springboot-examples 中的global-exception模块

    相关文章

      网友评论

          本文标题:Spring Spring Boot 实战,- 全局异常处理

          本文链接:https://www.haomeiwen.com/subject/mrripqtx.html