废话不多说,直接开搞

准备工作

1.安装Lombok插件,JDK1.8

2.本文中使用的统一返回数据类引入的是阿里考拉


<dependency><groupId>com.alibaba.cola</groupId><artifactId>cola-component-domain-starter</artifactId>/version>
</dependency>

枚举类

自定义枚举类有两个属性,errorCode 错误码,errorValue 错误原因。在后面自定义异常中会使用到此枚举类。

import lombok.AllArgsConstructor;
import lombok.Getter;/*** 异常枚举类* @author zhouzhou*/
@Getter
@AllArgsConstructor
public enum ErrorEnum {/*** 用户信息相关*/USER_NOT_EXIST_ERROR("20001","未查询到用户信息"),USER_NOT_LOGIN_ERROR("20002","用户登录信息有误,请重新登录"),;private String errorCode;private String errorValue;
}

自定义异常基类

自定义异常基类继承的也是RuntimeException,属于运行时异常,其中有两个成员变量,聪明的小伙伴是不是一眼就看出来这两个变量的含义了。


import lombok.Data;
/*** 业务类自定义异常类*/
@Data
public class BusinessException extends RuntimeException{private String errorCode;private String errorValue;public BusinessException(String errorCode, String errorValue){super(errorValue);this.errorCode = errorCode;this.errorValue = errorValue;}}

自定义业务异常

继承BusinessException,主要是用来区分是哪部分业务抛出的异常,也可以将类名改为业务模块名,比如UserException,这样在异常信息补获的时候可以更清晰的知道是哪部分业务抛出的异常。


import com.pailifan.meta.client.base.BusinessException;
import com.pailifan.meta.client.enums.ErrorEnum;/*** 自定义异常* @author zhouzhou*/
public class CustomerException extends BusinessException {public CustomerException(ErrorEnum ErrorEnum){super(ErrorEnum.getErrorCode(), ErrorEnum.getErrorValue());}
}

------------------重点来了-----------------

全局异常处理器

在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。参考:@ControllerAdvice 文档

import com.alibaba.cola.dto.Response;
import com.alibaba.cola.dto.SingleResponse;
import com.alibaba.cola.exception.BizException;
import com.pailifan.meta.client.base.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;/*** @Description* @Author zhouzhou**/
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {/** * @description: 捕获异常信息 * @param: [e] * @return: com.alibaba.cola.dto.Response * @author zhouzhou* @date: 2022/11/7 10:54*/@ResponseBody@ExceptionHandler(BusinessException.class)public Response handleBizException(BusinessException e) {log.error("BusinessException,code={},value={}", e.getErrorCode(),e.getErrorValue());return SingleResponse.buildFailure(e.getErrorCode(), e.getErrorValue());}@ResponseBody@ExceptionHandler(Exception.class)public Response handleException(Exception e) {log.error("Exception", e);return SingleResponse.buildFailure(String.valueOf(HttpStatus.INTERNAL_SERVER_ERROR.value()), "系统异常");}
}

使用

在业务代码使用中,如果校验条件不满足,可以直接使用throw抛出自定义异常信息,不用频繁的写try catch和手动拼接返回信息。

if(判断条件){throw new CustomerException(ErrorEnum.USER_NOT_EXIST_ERROR);}

成果展示


{"success": false,"errCode": "20002","errMessage": "用户登录信息有误,请重新登陆","data": null
}

http状态还是200,前端只需要根据success判断请求是否成功,如果失败可以直接弹框提示errMessage信息。成功状态下从data中获取数据

全局异常处理和自定义异常的意义

在开发过程中,后端接口返回的数据结构应该是统一且固定的,不应该因为后端发生异常而导致向前端返回的数据结构发生变化,这样就减少了前段的校验工作,只需要一套公共代码就能解析固定的数据结构。

而自定义异常是为了在发生错误时,可以从错误信息中更好更快的找到有用的提示信息。也可以通过异常信息快速的定位业务模块。

手把手带你实现JAVA自定义异常和全局异常处理相关推荐

  1. Java自定义异常、全局捕获异常、拦截器 实现动态控制登录超时

    Java自定义异常.全局捕获异常.拦截器 实现动态控制登录超时 参考文章: (1)Java自定义异常.全局捕获异常.拦截器 实现动态控制登录超时 (2)https://www.cnblogs.com/ ...

  2. 【手把手带你学Java EE】多线程那些事,你了解了吗?

    [手把手带你学Java EE]多线程那些事,你了解了吗? 线程 概念 意义 进程和线程的区别 面试题:谈谈进程和线程的区别和联系 Java中的多线程编程 创建线程的方法 方法一 方法二 方法三 &am ...

  3. java todo error_Java全局异常处理(TODO)

    ##spring mvc全局异常处理 ##原生servlet全局异常处理 ##非web java程序全局异常处理. ##对未捕获异常进行记录 ###使用Thread产生的异常. 使用Thread的方法 ...

  4. java future 线程 状态_手把手带你了解Java线程的实现方式及生命周期原理

    前言 我们在工作中线程技术很多情况下都能用的到,而且我们在面试的时候,线程技术基本上也是必问的.今天我来从线程的实现方式以及线程的生命周期做一个全面的讲解与分析,帮助大家能更好的去了解线程技术. 概念 ...

  5. 手把手带你入门Java中File类

    零基础学习Java之File类 概述 构造方法 基本介绍 代码示例 常用方法 获取文件和目录的基本信息 代码示例 判断功能 代码示例 创建和删除功能 代码示例 目录遍历功能 代码示例 概述 要学习Ja ...

  6. java 字节码分析_手把手带你分析Java中的Class字节码文件

    分析Class文件的源码如下: package org.yuequan.klass; public private int m; public int inc(){ return m + 1; } } ...

  7. java thread 线程销毁_手把手带你了解Java线程的实现方式及生命周期原理

    前言 我们在工作中线程技术很多情况下都能用的到,而且我们在面试的时候,线程技术基本上也是必问的.今天我来从线程的实现方式以及线程的生命周期做一个全面的讲解与分析,帮助大家能更好的去了解线程技术. 概念 ...

  8. 手把手带你部署Java项目到Linux服务器

    前言 想买服务器很久了.之前领过腾讯云免费的15天体验服务器,在里面进行了一些小项目的部署,基本学会了部署流程,这两天准备购买一个自己用的小服务器,个人使用,最主要的就是要便宜,于是乎开始了货比三家, ...

  9. java对对碰游戏设计报告_手把手带你用Java打造一款对对碰游戏(下篇)

    上篇文章介绍了对对碰游戏的理论部分和介绍了JLabel.JButton.JPanel.ImageIcon.JTextField.JProgressBar等组件的基本使用,介绍了进度条(JProgres ...

最新文章

  1. AS 400 常用命令
  2. 【c语言】蓝桥杯算法提高 简单加法
  3. ASP.NET 2.0的异步页面刷新真给劲
  4. 使用SSH框架实现用户登录验证
  5. ASP.NET Core 中文文档 第四章 MVC(4.3)过滤器
  6. 你真正的去了解过Linux吗?不单单是一些命令操作,比如它的系统架构!!!
  7. 文件系统管理 之 文件和目录访问权限设置
  8. 由浅到深理解ROS(4)
  9. Spring中为什么要开启注解扫描
  10. 分享Swing学习的一些经验
  11. NLTK文本分割器是如何工作的
  12. 服务器主机性能,服务器主机性能分析
  13. 服务器端返回的状态码是什么意思
  14. 解决:outlook邮件内容过宽,打印不全
  15. react项目Menu菜单栏、iconfont图标引用
  16. 架构设计--软件工程
  17. 数据分析案例(二手车)
  18. python3 -c ‘import pty;pty.spawn(“/bin/bash“)‘升级切换交互式shell
  19. 年轻人的浮躁,这社会的喧嚣
  20. 程序员如何规划自己的职业生涯?

热门文章

  1. 英语作文 计算机科学的未来趋势,2019高考英语作文10大热点预测+范文(书面表达).docx...
  2. vue2集成声网-环信即时通讯SDK,建议实现两人聊天
  3. MySQL创建数据库,用户,赋予权限
  4. php获取网络图片的大小,PHP获取远程图片尺寸和大小实例演示
  5. 基于VFW的视频应用程序开发
  6. ibm bpm实战指南_IBM Security Network Protection实施指南(针对技术人员的XGS)
  7. 深度学习中的fan_in与fan_out
  8. 创建数据库并指定字符集
  9. 药物膜过滤的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  10. 微信App支付相关问题