多语言展示
当前在线:1945今日阅读:19今日分享:20

SpringBoot系列2-全局统一异常处理

为什么要全局统一异常处理呢?如果系统发生了异常,不做统一异常处理,前端会给用户展示一大片看不懂的文字。做统一异常处理后当异常发生后可以给用户一个温馨的提示,不至于使用户满头雾水,所以一方面是为了更好的用户体验 如果不统一全局异常,服务端和前端在遇到异常的时候处理起来杂乱无章非常费力。所以另一方面是为了制定规范提高工作效率SpringBoot如何实现全局统一异常处理呢?
方法/步骤
1

SpringBoot如何实现全局统一异常处理呢?项目目录结构

2

自定义异常类pom.xml加入lombok依赖       org.projectlombok       lombok

3

编写MyException.java类@Getter@Setterpublic class MyException extends RuntimeException {   private Integer code;   public MyException(String msg){       super(msg);   }   public MyException(Integer code,String msg){       super(msg);       this.code=code;   }}

4

自定义枚举类public enum ResultEnum {   SUCCESS(200,'成功'),   FAIL(100,'失败'),   EXCEPTION(300,'系统异常'),   UNLOGIN(201,'未登录');   private Integer code;   private String msg;   private ResultEnum(Integer code,String msg){       this.code=code;       this.msg=msg;   }   public Integer getCode() {       return code;   }   public void setCode(Integer code) {       this.code = code;   }   public String getMsg() {       return msg;   }

5

自定义全局异常捕获类@ControllerAdvicepublic class MyExceptionAdvice {   @ExceptionHandler(value = Exception.class)   @ResponseBody   public Result defaultException(HttpServletRequest request,Exception e){       e.printStackTrace();       return Result.builder()               .code(ResultEnum.EXCEPTION.getCode())               .message(ResultEnum.EXCEPTION.getMsg())               .build();   }   @ExceptionHandler(value = MyException.class)   @ResponseBody   public Result myException(HttpServletRequest request,MyException e){       e.printStackTrace();       Integer code=e.getCode();       String message=e.getMessage();       if (e.getCode()==null){           code=ResultEnum.EXCEPTION.getCode();       }       if (e.getMessage()==null){           message=ResultEnum.EXCEPTION.getMsg();       }       return Result.builder()               .code(code)               .message(message)               .build();   }}

6

编写ExceptionController进行测试@RestControllerpublic class ExceptionController {   @RequestMapping('/exception')   public Result exception(String name,String pwd) throws Exception {           String realname='tiankonglanlande';           String realPwd='123';           if(null!=name&&name.equals('xx')){               throw new Exception('系统异常!');           }           if(StringUtils.isEmpty(name)||StringUtils.isEmpty(pwd)){               throw new MyException('参数必须传!');           }else if (!name.equals(realname)||!pwd.equals(realPwd)){               throw new MyException('用户名或密码不正确!');           }else if (name.equals('aa')){               throw new MyException(200,'用户名存在!');           }           String info='你好['+name+']!';       return ResultUtils.success(info);   }   @RequestMapping('/unlogin')   public Result unlogin() throws Exception {       return ResultUtils.success(ResultEnum.UNLOGIN);   }   @RequestMapping('/success')   public Result success() throws Exception {       return ResultUtils.success(200,'自定义消息');   }}

7

运行测试在浏览器访问可以看到浏览器返回对应的json字符

注意事项

上面只是重要的代码片段,只做参考。直接拷贝是运行不了的,源码请点击参考资料链接下载

推荐信息