项目中的统一异常处理

news2024/12/23 17:18:53

目录

1:异常处理

1.1:异常问题分析

1.2:统一异常处理实现

1.2.1:全局异常处理器

1.2.2:自定义异常类

1.2.3:统一响应前端异常信息封装类

1.2.4:通用的异常信息枚举类

1.2.5:测试 


1:异常处理

1.1:异常问题分析

在service方法中有很多的参数合法性校验,当参数不合法则抛出异常,下边我们测试下异常处理。

请求创建课程基本信息,故意将必填项设置为空。

测试发现报500异常,如下:

 返回这样错误的信息的在客户端展示显然是不行的。

问题:并没有输出我们抛出异常时指定的异常信息。

所以,现在我们的需求是当正常操作时按接口要求返回数据,当非正常流程时要获取异常信息进行记录,并提示给用户。

异常处理除了输出在日志中,还需要提示给用户,前端和后端需要作一些约定:

1、错误提示信息统一以json格式返回给前端。

2、以HTTP状态码决定当前是否出错,非200为操作异常。

如何规范异常信息?

代码中统一抛出项目的自定义异常类型,这样可以统一去捕获这一类或几类的异常。

规范了异常类型就可以去获取异常信息。

如果捕获了非项目自定义的异常类型统一向用户提示“执行过程异常,请重试”的错误信息。

如何捕获异常?

代码统一用try/catch方式去捕获代码比较臃肿,可以通过SpringMVC提供的控制器增强类统一由一个类去完成异常的捕获。

如下图:

1.2:统一异常处理实现

根据上边分析的方案,统一在base基础工程实现统一异常处理,各模块依赖了base基础工程都 可以使用。

首先在base基础工程添加需要依赖的包:

Java
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

1.2.1:全局异常处理器

 从 Spring 3.0 - Spring 3.2 版本之间,对 Spring 架构和 SpringMVC 的Controller 的异常捕获提供了相应的异常处理。

  • @ExceptionHandler
  • Spring3.0提供的标识在方法上或类上的注解,用来表明方法的处理异常类型。
  • @ControllerAdvice
  • Spring3.2提供的新注解,从名字上可以看出大体意思是控制器增强,        在项目中来增强SpringMVC中的Controller。通常和@ExceptionHandler 结合使用,来处理SpringMVC的异常信息。
  • @ResponseStatus
  • Spring3.0提供的标识在方法上或类上的注解,用状态代码和应返回的原因标记方法或异常类。
    调用处理程序方法时,状态代码将应用于HTTP响应。
/**
 * @author 爱吃豆的土豆
 * @version 1.0
 * @description TODO
 * @date 2023/2/12 17:01
 */
@Slf4j
@ControllerAdvice
//@RestControllerAdvice
public class GlobalExceptionHandler {

 //对项目的自定义异常类型进行处理
   @ResponseBody
   @ExceptionHandler(XueChengPlusException.class)
   @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
 public RestErrorResponse customException(XueChengPlusException e){

    //记录异常
    log.error("系统异常{}",e.getErrMessage(),e);
    //..

    //解析出异常信息
    String errMessage = e.getErrMessage();
    RestErrorResponse restErrorResponse = new RestErrorResponse(errMessage);
    return restErrorResponse;
   }


   @ResponseBody
   @ExceptionHandler(Exception.class)
   @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
 public RestErrorResponse exception(Exception e){

    //记录异常
    log.error("系统异常{}",e.getMessage(),e);

    //解析出异常信息
    RestErrorResponse restErrorResponse = new RestErrorResponse(CommonError.UNKOWN_ERROR.getErrorMessage());

    return restErrorResponse;
   }
}

1.2.2:自定义异常类


/**
 * @author 爱吃豆的土豆
 * @description 本项目自定义异常类型
 */
public class XueChengPlusException extends RuntimeException {

    private String errMessage;

    public XueChengPlusException() {
    }

    public XueChengPlusException(String message) {
        super(message);
        this.errMessage = message;

    }

    public String getErrMessage() {
        return errMessage;
    }

    public void setErrMessage(String errMessage) {
        this.errMessage = errMessage;
    }

    /**
     * 传入自定义异常信息
     * @param message
     */
    public static void cast(String message){
        throw new XueChengPlusException(message);
    }
    /**
     * 重载了一下方法,调用规定好的枚举异常类中的信息
     * @param error
     */
    public static void cast(CommonError error){
        throw new XueChengPlusException(error.getErrorMessage());
    }
}

1.2.3:统一响应前端异常信息封装类

/**
 * @author 爱吃豆的土豆
 * @version 1.0
 * @description 和前端约定返回的异常信息模型
 * @date 2023/2/12 16:55
 */
public class RestErrorResponse implements Serializable {

 private String errMessage;

 public RestErrorResponse(String errMessage){
  this.errMessage= errMessage;
 }

 public String getErrMessage() {
  return errMessage;
 }

 public void setErrMessage(String errMessage) {
  this.errMessage = errMessage;
 }
}

1.2.4:通用的异常信息枚举类

/**
 * @Author 爱吃豆的土豆、
 * @Date 2023/4/22 15:44
 * @desc 系统执行过程中出现的异常信息
 */
public enum CommonError {
    UNKOWN_ERROR("执行过程异常,请重试。"),
    PARAMS_ERROR("非法参数"),
    OBJECT_NULL("对象为空"),
    QUERY_NULL("查询结果为空"),
    REQUEST_NULL("请求参数为空");

    private String errorMessage;

     CommonError(String errorMessage) {
        this.errorMessage = errorMessage;
    }

    public String getErrorMessage() {
        return errorMessage;
    }

    public void setErrorMessage(String errorMessage) {
        this.errorMessage = errorMessage;
    }
}

1.2.5:测试 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/466442.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Studio小白安装教程,以及第一个Android项目案例的调试运行

小白友好型教学&#xff1a; 本文从小白角度出发&#xff0c;手把手教你一步一步成功安装“Android Studio”&#xff0c;并结合案例&#xff0c;编写你的第一个手机APP到手机上运行。由于安装过程较长&#xff0c;建议大家跟着截图&#xff0c;注意细节&#xff0c;不然容易出…

改进YOLOv8 | Neck篇 | YOLOv8 应用轻量级通用上采样算子CARAFE | 《特征的内容感知重组》

特征上采样是现代卷积神经网络架构中的关键操作,例如特征金字塔。其设计对于密集预测任务,如目标检测和语义/实例分割至关重要。在本研究中,我们提出了一种称为内容感知特征重组(CARAFE)的通用、轻量级且高效的操作符,以实现这一目标。CARAFE具有以下几个优点:(1)大的…

Visual Studio 2019 C# 上位机入门(1):如何创建工程编写一个简单应用

Visual Studio 2019下载安装步骤可以看&#xff1a;https://blog.csdn.net/weixin_44788542/article/details/114271126 这里不赘述&#xff0c;默认电脑上已经安装好了。 1、打开安装好的Visual Studio后&#xff0c;选择创建新项目。 2、找到选择C#下面的Windows 窗体应用&…

【源码】Spring Cloud Gateway 是在哪里调用后端真实服务的?

前言 我们知道 Spring Cloud Gateway 最终一定会将请求路由到后端的真实服务上&#xff0c;那么你知道 Spring Cloud Gateway 是在哪里调用的后端服务吗&#xff1f; 源码之下无秘密&#xff0c;让我们一起从源码中寻找答案。 源码分析 上图是来自Spring Cloud Gateway 官网…

Apache Druid RCE漏洞复现(QVD-2023-9629)

0x01 产品简介 Apache Druid是一个高性能的实时大数据分析引擎&#xff0c;支持快速数据摄取、实时查询和数据可视化。它主要用于OLAP&#xff08;在线分析处理&#xff09;场景&#xff0c;能处理PB级别的数据。Druid具有高度可扩展、低延迟和高吞吐量的特点&#xff0c;广泛应…

快手智能处理与编码算法产品化之路

视频转码过程中涉及方方面面的视频图像算法&#xff0c;如何将算法有机地结合起来&#xff0c;打造成为行业领先的视频转码算法产品&#xff1f;通过多年的业务场景打磨和积累&#xff0c;快手音视频走出了一条自己的产品化之路。LiveVideoStackCon 2022北京站邀请到了快手视频…

生成式AI火爆全球,你是否已经做好了准备?

2023年&#xff0c;随着ChatGPT的火爆全球&#xff0c;生成式AI也引发了各界人士的广泛关注。一时间&#xff0c;从国际科技巨头到国内人工智能企业&#xff0c;几乎所有我们耳熟能详的科技公司&#xff0c;都纷纷杀入了生成式AI市场。 作为全球云计算技术的开创者和领导者&…

【python中的对象存储:堆?栈?】

堆空间和栈空间 堆空间和栈空间是计算机内存中的两个存储区域&#xff0c;主要的区别有以下几点&#xff1a; 分配方式&#xff1a;栈空间中的内存由编译器或解释器自动分配和释放&#xff0c;无需手动干预。堆空间中的内存则需要由程序员手动申请和释放。内存大小&#xff1…

招商基金数字化转型下的研发管理|发布会精彩回顾

在 4 月 20 日举行的《中国企业软件研发管理白皮书》发布会上&#xff0c;招商基金信息技术部副总监、研发中心主管刘志昆作了《招商基金数字化转型下的研发管理》主题演讲&#xff0c;从数字化转型背景、研发管理所遇到的挑战出发&#xff0c;讲述招商基金如何摸索出适合自身环…

Java多线程与锁

前文中&#xff0c;我们已经了解了什么是线程&#xff0c;线程间常用通信方式&#xff0c;线程池以及其相关特性&#xff0c;可以看出锁在多线程环境中充当着重要作用&#xff0c;不管是线程间的数据通信&#xff0c;还是线程间的等待和唤醒&#xff0c;都依赖于锁&#xff0c;…

《编码——隐匿在计算机软硬件背后的语言》精炼——第13-14章(二进制减法器——1位存储器)

“成功不是最终的&#xff0c;失败不是致命的&#xff0c;勇气才是最关键的。” - 温斯顿丘吉尔 文章目录 如何实现减法计算机进行减法运算的逻辑借位的代替机制二进制下的替代机制 减法的电路实现 反馈与触发器电铃触发器R-S触发器 电平触发的D型触发器 如何实现减法 计算机进…

Haproxy搭建Web群集

Haproxy 支持四层和七层反向代理 LVS 支持四层反向代理 目前常见的Web集群调度器分为软件和硬件软件通常使用开源的LVS、Haproxy、Nginx硬件一般使用比较多的是F5&#xff0c;也有很多人使用国内的一些产品&#xff0c;如梭子鱼、绿盟等&#xff1b;云 SLB CLB Haproxy应用分析…

配置Docker镜像加速器-Docker命令-Docker 容器的数据卷

Docker架构 docker进程&#xff08;daemon&#xff09; 镜像&#xff08;Image&#xff09;&#xff1a;Docker 镜像&#xff08;Image&#xff09;&#xff0c;就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件…

OpenJudge - 39:多项式输出

目录 一、题目描述 二、代码实现 一、题目描述 一元 n 次多项式可用如下的表达式表示&#xff1a; ​ 其中&#xff0c;​ 称为 i 次项&#xff0c;​ 称为 i 次项的系数。给出一个一元多项式各项的次数和系数&#xff0c;请按照如下规定的格式要求输出该多项式&#xff…

如何在本地搭建Maven环境并整合进IDEA中?【2023最新版】

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 操作系统&#xff1a;win10 x64 位 家庭版 Maven版本&#xff1a;apache-maven-3.6.3 目录 一. 为什么要使用Maven&#xff1f;1.1 获取jar包1.2 添加jar包1.3 使用Maven便于解决jar包冲突及依赖问题 二. 什么是Maven?三. 如何…

排序算法 - 选择排序(Selection sort)

文章目录 选择排序介绍选择排序实现选择排序的时间复杂度和稳定性选择排序时间复杂度选择排序稳定性 代码实现核心&总结 每日一道算法&#xff0c;提高脑力。第四天&#xff0c;选择排序。 选择排序介绍 它的基本思想是: 首先在未排序的数列中找到最小(or最大)元素&#…

Three.js--》理解光源对物体产生影响的重要性

上篇文章 前端开发者掌握3d技术不再是梦&#xff0c;初识threejs 作为three.js入门篇讲解了许多内容但是没有深入了解其原理以及实现方法&#xff0c;仅仅只是展示了实现的内容及代码&#xff0c;本篇文章将深入讲解实现效果其背后用到的知识与原理。 目录 使用相机控件轨道控…

博途PID编程应用(状态机)

博途工艺PID的详细解读可以查看下面的博客文章,这里不再赘述 博途PLC 1200/1500PLC 工艺对象PID PID_Compact详细解读_RXXW_Dor的博客-CSDN博客这篇博文我们详细解读博途PLC自带的PID功能块PID_Compact,大部分工业闭环调节过程,我们采用系统自带的PID功能块基本都能胜任,一…

接收来自客户端的参数使用【JSR303校验框架】进行校验参数是否合法

目录 1&#xff1a;JSR303校验 1.1&#xff1a;统一校验的需求 1.2&#xff1a;统一校验实现 1.3&#xff1a;分组校验 1.4&#xff1a;校验规则不满足&#xff1f; 1&#xff1a;JSR303校验 1.1&#xff1a;统一校验的需求 前端请求后端接口传输参数&#xff0c;是在co…

CTFShow-Web篇详细wp(持续更新中ing)

CTFShow-Web篇详细wp web签到题web2web3web4web5web6web7web8 CTFShow 平台&#xff1a;https://ctf.show/ web签到题 直接F12然后Base64解码 ctfshow{19bdf375-f974-481e-8c62-0f4c3d170fb4} web2 考点&#xff1a;联合查询 先尝试使用万能密码登入 ‘ or 11# 登入成功&am…