首页 > 其他分享 >SpringBoot统一异常处理

SpringBoot统一异常处理

时间:2024-08-21 11:52:32浏览次数:6  
标签:return SpringBoot MsgData String msg 异常 public 统一

简介

Spring Boot项目中实现统一的异常处理是一种常见的做法,这有助于保持代码的整洁并提供一致的错误响应格式。Spring Boot 中的统一异常处理是一种机制,用于集中管理和格式化应用程序中抛出的所有异常。这种机制可以提高程序的健壮性和用户体验,同时简化开发过程。

统一异常处理的一些主要作用:

  1. 一致性:
    保证了在不同地方发生的异常都能以相同的方式被处理和响应。
    用户或客户端接收到的错误信息和格式保持一致,有助于问题定位。
  2. 错误信息定制:
    可以根据需要定制错误信息,包括HTTP状态码、错误代码和描述等。
    这样可以更好地向用户解释发生了什么问题,并提供可能的解决方法。
  3. 日志记录:
    在捕获异常后,可以根据异常类型和级别记录到日志文件中,便于后续分析和调试。
    日志记录可以帮助追踪问题发生的时间点、环境和上下文。
  4. 资源释放:
    在某些情况下,可以在异常处理过程中释放资源或者进行清理工作,确保系统稳定运行。
  5. API 文档化:
    对于对外提供的 API,可以通过异常处理来定义预期的错误情况,这有助于生成清晰的 API 文档。
  6. 安全性:
    可以避免敏感信息泄露给客户端,例如数据库查询语句、内部类名等。
    可以返回更泛化的错误信息,而不是具体的异常堆栈跟踪。
  7. 性能优化:
    通过合理设计异常处理逻辑,可以减少不必要的资源消耗和调用链路,从而提升整体性能。

实现

1.创建自定义异常类

根据项目场景创建一些自定义异常类 extends RuntimeException

  • WarnException 警告类异常
@Data
public class WarnException extends RuntimeException{

    public WarnException(String msg){
        super(msg);
    }
}

返回告警信息,
日志记录WARN级别日志,且不打印堆栈
异常概要信息不会落库

  • UserException 用户业务类异常
@Data
public class UserException extends RuntimeException {

    public UserException(String msg) {
        super(msg);
    }

    @Override
    public String toString() {
        return getClass().getName() + StringConstant.COLON +this.getMessage();
    }
}

返回告警信息,
日志记录ERROR级别日志,且打印堆栈
异常概要信息落库

StringConstant.COLON = ":"

  • PlatformException 系统内部异常
@Data
public class PlatformException extends RuntimeException {

    public PlatformException(String msg) {
        super(msg);
    }

    @Override
    public String toString() {
        return getClass().getName() + StringConstant.COLON +this.getMessage();
    }

}

返回告警信息,
日志记录ERROR级别日志,且打印堆栈
异常概要信息落库

StringConstant.COLON = ":"

2.创建全局异常处理器

定义一个带有 @ControllerAdvice 注解的类,并在其中声明一个或多个带有 @ExceptionHandler 注解的方法来处理特定类型的异常

  • ZKExceptionHandler统一异常处理类
@ControllerAdvice
@Slf4j
public class ZKExceptionHandler {

    @Autowired
    private AlarmMsgService alarmMsgService;

    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public <T> MsgData<T> handleException(Exception e) {
        //预期内告警类异常不计入数据库;日志不记录堆栈
        if (e instanceof WarnException) {
            WarnException warnException = (WarnException) e;
            log.warn(warnException.getMessage());
            return MsgData.fill(warnException.getMessage());
        }
        String msg = e.getMessage();
        String exceptionName = e.getClass().getName();
        String stackTrace = ExceptionUtils.getStackTrace(e);
        //用户异常
        if (e instanceof UserException) {
            alarmMsgService.saveUserAlarmMsg(msg, AlarmLevelEnum.ALARM, exceptionName, stackTrace);
            log.error("UserException", e);
            return MsgData.fill(msg);
        }
        //平台类异常
        if (e instanceof PlatformException) {
            alarmMsgService.savePlatformAlarmMsg(msg, AlarmLevelEnum.ALARM, exceptionName, stackTrace);
            log.error("PlatformException", e);
            return MsgData.fill(msg);
        }
        //其他异常
        alarmMsgService.saveOtherAlarmMsg("系统异常", AlarmLevelEnum.ALARM, exceptionName, stackTrace);
        log.error("OtherException", e);
        return MsgData.fill(msg);
    }
}

alarmMsgService为异常概要信息入库操作,可自定义替换为自己的数据库操作
这里会对三种自定义异常分别进行处理,用于达到信息返回及记录预期
对于其他异常也会进行兜底记录及处理

  • MsgData 返回实体类
@Data
public class MsgData<T> {
    private int status;
    private String errorCode;
    private String msg;
    private T data;

    public static <T> MsgData<T> success() {
        return success(null);
    }

    public static <T> MsgData<T> success(T data) {
        return success(null, data);
    }

    public static <T> MsgData<T> success(String msg) {
        return success(msg, null);
    }

    public static <T> MsgData<T> success(String msg, T data) {
        return success(HttpCodeConstant.SUCCESS, msg, data);
    }

    public static <T> MsgData<T> success(int status, String msg, T data) {
        MsgData<T> msgData = new MsgData<>();
        msgData.setStatus(status);
        msgData.setMsg(msg);
        msgData.setData(data);
        return msgData;
    }

    public static <T> MsgData<T> fill(String msg) {
        return fill(null, msg);
    }

    public static <T> MsgData<T> fill(String errorCode, String msg) {
        return fill(HttpCodeConstant.ERROR, errorCode, msg, null);
    }

    public static <T> MsgData<T> fill(int status, String errorCode, String msg, T data) {
        MsgData<T> msgData = new MsgData<>();
        msgData.setStatus(status);
        msgData.setErrorCode(errorCode);
        msgData.setMsg(msg);
        msgData.setData(data);
        return msgData;
    }

}

HttpCodeConstant.SUCCESS = 200
HttpCodeConstant.ERROR = 500

使用

通过throw 不同的Exception进行区分不同的异常

// 警告类异常
throw new WarnException("测试WARN告警");
// 用户业务类异常
throw new UserException("测试用户告警");
// 平台系统类异常
throw new PlatformException("测试平台告警");
// 其他异常
throw new RuntimeException("测试系统告警");

结束

标签:return,SpringBoot,MsgData,String,msg,异常,public,统一
From: https://blog.csdn.net/zk_tww/article/details/141230436

相关文章

  • SpringBoot 整合
    SpringBoot整合 1.SpringBoot整合SpringMVC和创建一个SpringBoot项目相同,需要导入web相关的启动器,创建Controller即可在yaml配置文件中,常用配置有:server.port:指定服务器端口号server.servlet.context.path:设置项目的根路径spring.mvc.view.prefix和spring.m......
  • KingbaseES V8R6备份恢复案例之---sys_backup.conf配置异常初始化失败
    案例说明:KingbaseESV8R6数据库执行sys_backup.shinit初始化时,出现“ERROR:cannotconnecttheprimarynode...."错误,初始化失败。适用版本:KingbaseESV8R6一、问题现象如下所示,执行sys_backup.shinit时,出现以下错误”ERROR:cannotconnecttheprimarynode..."。[......
  • 一站式统一返回值封装、异常处理、异常错误码解决方案—最强的Sping Boot接口优雅响应
    1.前言统一返回值封装、统一异常处理和异常错误码体系的意义在于提高代码的可维护性和可读性,使得代码更加健壮和稳定。统一返回值封装可以避免每一个接口都需要手工拼装响应报文;统一异常处理可以将异常处理的逻辑集中到一个地方,避免代码中出现大量的try-catch语句,降低了代码的......
  • 1Java加强----异常
    1.异常体系1.1异常入门1.1运行时异常publicstaticvoidshow(){//int[]arr={1,2,3};//System.out.println(arr[3]);//.ArrayIndexOutOfBoundsException数组越界异常//Stringstr=null;System.out.println(str.length());//Nul......
  • 基于Java+SpringBoot+Vue的房屋租赁管理系统的设计与实现
    基于Java+SpringBoot+Vue的房屋租赁管理系统的设计与实现前言✌全网粉丝20W+,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌......
  • 【SpringBoot实用小知识】SpringBoot在运行时更新配置信息
    SpringBoot运行时更改配置信息前言准备思路编码测试用数据库配置表基础配置抽象类测试配置实现类定义Controller接收测试最后前言对于很多项目而言都需要配置来进行一些服务的设定如果每次更改配置文件并重启那么有些太浪费时间我们可不可以通过请求修改配置......
  • springboot自动配置原理-面试题
    网络上看很多文章并没什么用,重点没说到,不知道从那里入手讲,刷到的直接按照下面这个,背出来就行了1、当启动springboot应用程序的时候,会先创建SpringApplication的对象,在对象的构造方法中会进行某些参数的初始化工作,最主要的是判断当前应用程序的类型以及初始化器和监听器,在这个......
  • 基于springboot万里学院摄影社团管理系统(源码+文档+调试+讲解)
    收藏关注不迷路!!......
  • springboot怎么配置多个yml文件
    目录方式一:多个yml文件方式二:单个yml文件方式三:在pom.xml中指定环境配置掌握方式一就够了,方式二、三可以不看以下三种方式都可以实现多环境的配置。在application.yml主配置文件中做项目通用的配置,在其他配置文件中做不同环境下的配置,以避免重复配置的情况。方式......
  • 【2025毕设热门选题】《基于SpringBoot+Vue的校园资产管理系统》功能规划和开题报告
    博主介绍:8年资深码农、211小硕,全网10万+粉丝。文科生转码,所以非常懂小白学习历程。java领域优质创作者,擅长小白基础课程教学和项目讲解辅导。专注于Java技术领域和大学生毕业项目实战讲解已经5年,服务10000+小白客户。技术范围:自己手撸SpringBoot、Vue、javaweb网站、小程......