23.SpringCloud实战项目-整合统一异常处理
发布日期:2021-05-09 03:44:18 浏览次数:19 分类:博客文章

本文共 3434 字,大约阅读时间需要 11 分钟。

简介

  • PassJava-Learning项目是PassJava(佳必过)项目的学习教程。对架构、业务、技术要点进行讲解。
  • PassJava 是一款Java面试刷题的开源系统,可以用零碎时间利用小程序查看常见面试题,夯实Java基础。
  • PassJava 项目可以教会你如何搭建SpringBoot项目,Spring Cloud项目
  • 采用流行的技术,如 SpringBoot、MyBatis、Redis、 MySql、 MongoDB、 RabbitMQ、Elasticsearch,采用Docker容器化部署。

更好的阅读体验

  • 文档地址:
  • 备用地址:

文档连载目录

整合统一异常处理

一、缘起

我们在写代码的时候,通常会在方法里面添加各种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
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());}

代码地址

公众号

上一篇:《SpringCloud实战项目》系列目录
下一篇:22.SpringCloud实战项目-整合OSS对象存储

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2025年04月17日 15时51分52秒