写点什么

SpringCloud 整合统一异常处理

发布于: 2021 年 04 月 26 日

PassJava (佳必过) 项目全套学习教程连载中


文档在线地址:www.passjava.cn

SpringCloud 整合统一异常处理

一、缘起

我们在写代码的时候,通常会在方法里面添加各种 try catch 来捕获异常,会发现有很多重复的代码,所以我们可以整合统一异常处理来优化代码结构。


拦截异常并统一处理我们可以用到@RestControllerAdvice注解

二、自定义异常处理类

  • 添加统一异常处理类注解@RestControllerAdvice

  • 添加日志注解@Slf4j

  • 添加异常处理方法注解@ExceptionHandler


package com.jackson0714.passjava.question.exception;
/** 集中处理所有异常 */@Slf4j@RestControllerAdvice(basePackages = "com.jackson0714.passjava.question.controller")public class PassjavaExceptionControllerAdvice {
@ResponseBody @ExceptionHandler(value= MethodArgumentNotValidException.class) public R handleValidException(MethodArgumentNotValidException e) { log.error("数据校验出现问题{},异常类型:{}", e.getMessage(), e.getClass()); BindingResult bindingResult = e.getBindingResult(); Map<String, String> errorMap = new HashMap<>(); bindingResult.getFieldErrors().forEach((fieldError)->{ errorMap.put(fieldError.getField(), fieldError.getDefaultMessage()); });
return R.error(BizCodeEnum.VALID_EXCEPTION.getCode(), BizCodeEnum.VALID_EXCEPTION.getMsg()).put("data", errorMap); }
@ExceptionHandler(value=Throwable.class) public R handleException(Throwable throwable) { log.error("未知异常{},异常类型:{}", throwable.getMessage(), throwable.getClass()); return R.error(BizCodeEnum.UNKNOWN_EXCEPTION.getCode(), BizCodeEnum.UNKNOWN_EXCEPTION.getMsg()); }}
复制代码

三、推荐的系统错误码

1.错误码和错误信息定义类

  • 1.错误码长度:5 个数字

  • 2.前两位:业务场景

  • 3.后三位:错误码


10:通用业务  001:参数格式校验错误(10001)11:会员业务12:题目业务13:内容业务14:学习业务
复制代码

2.错误码枚举类

com.jackson0714.common.exception.BizCodeEnum


定义了两种异常枚举:系统未知异常、参数格式校验失败


package com.jackson0714.common.exception;
public enum BizCodeEnum { UNKNOWN_EXCEPTION(10000, "系统未知异常"), VALID_EXCEPTION(10001, "参数格式校验失败");
private int code; private String msg; BizCodeEnum(int code, String msg) { this.code = code; this.msg = msg; }
public int getCode() { return code; }
public String getMsg() { return msg; }}
复制代码

四、测试代码

测试场景 1:校验参数 displayOrder 必须为正整数,如果 displayOrder 不为正整数,则会抛出异常


  • 1.实体类上添加校验注解@Positive


/** * 排序 */@Positiveprivate Integer displayOrder;
复制代码


  • 2.controller 类里面添加 save 方法,并添加校验参数注解 @Valid


/*** 保存*/@RequestMapping("/save")public R save(@Valid @RequestBody QuestionEntity question){    questionService.save(question);
return R.ok();}
复制代码


测试:


用 Postman 工具调用 save 方法


请求地址:


http://192.168.10.160:8060/api/question/v1/admin/question/save
复制代码


请求参数:


{    "displayOrder": 0.2}
复制代码


返回结果:


{    "msg": "参数格式校验失败",    "code": 10001,    "data": {        "displayOrder": "必须是正数"    }}
复制代码


测试场景 2:对于代码里面直接抛出的异常,也可以 handle


1.controller 类里面添加查询题目的方法,并抛出 Exception 异常


/*** 信息*/@RequestMapping("/info/{id}")//@RequiresPermissions("question:question:info")public R info(@PathVariable("id") Long id) throws Exception {    QuestionEntity question = questionService.getById(id);    throw new Exception("test");
//return R.ok().put("question", question);}
复制代码


测试:


用 Postman 工具调用 save 方法


请求地址:


http://192.168.10.160:8060/api/question/v1/admin/question/save
复制代码


返回结果:


{    "msg": "系统未知异常",    "code": 10000}
复制代码


证明统一处理方法被调用了:


@ExceptionHandler(value=Throwable.class)public R handleException(Throwable throwable) {    return R.error(BizCodeEnum.UNKNOWN_EXCEPTION.getCode(), BizCodeEnum.UNKNOWN_EXCEPTION.getMsg());}
复制代码

代码地址

https://github.com/Jackson0714/PassJava-Platform


发布于: 2021 年 04 月 26 日阅读数: 100
用户头像

用故事、大白话讲解Java、分布式、架构设计 2018.05.06 加入

公众号:「悟空聊架构」

评论 (1 条评论)

发布
用户头像
多个模块都使用呢
2021 年 04 月 27 日 14:13
回复
没有更多了
SpringCloud整合统一异常处理