当前位置: 首页 > news >正文

异常处理总结

自定义异常

​ 系统中的异常可以分为我们能预知的异常和未知的系统异常,对于我们能预知的异常如空值判断,用户名错误,密码错误等异常我们需要返回客户端,对于系统内部异常如SQL语法错误,参数格式转换错误等需要统一包装成友好的提示后再返回客户端,否则用户也看不懂系统内部的异常。

定义响应码ResponseCode ,方便之后的自定义异常

public enum ResponseCode {RESPONSE_CODE_200(200, "操作成功"),RESPONSE_CODE_400(400, "参数错误"),RESPONSE_CODE_1001(1001, "激活失败已过期"),RESPONSE_CODE_1002(1002, "密码不一致")private Integer code;private String message;ResponseCode(Integer code, String message) {this.code = code;this.message = message;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}
}

定义已知异常BusinessException,用于区分项目中的已知异常和未知异常


public class BusinessException extends RuntimeException{private Integer code;public BusinessException(ResponseCode responseCode) {super(responseCode.getMessage());this.code = responseCode.getCode();}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public BusinessException() {super();}public BusinessException(String s) {super(s);}public BusinessException(String message, Throwable cause) {super(message, cause);}public BusinessException(Throwable cause) {super(cause);}protected BusinessException(String message, Throwable cause,boolean enableSuppression,boolean writableStackTrace) {super(message, cause, enableSuppression, writableStackTrace);}
}

自定义断言工具类,避免大量if判断

public class AssertUtils {public static void isTrue(Boolean flag, ResponseCode responseCode) {if (!flag) {throw new BusinessException(responseCode);}}public static void isBlank(String str, ResponseCode responseCode) {if (StrUtil.isNotBlank(str)) {throw new BusinessException(responseCode);}}public static void isNotBlank(String str, ResponseCode responseCode) {if (StrUtil.isBlank(str)) {throw new BusinessException(responseCode);}}public static void isNull(Object object, ResponseCode responseCode) {if (Objects.nonNull(object)) {throw new BusinessException(responseCode);}}public static void isNotNull(Object object, ResponseCode responseCode) {if (Objects.isNull(object)) {throw new BusinessException(responseCode);}}public static void isNull(Collection collection, ResponseCode responseCode) {if (collection != null && !collection.isEmpty()) {throw new BusinessException(responseCode);}}public static void isNotNull(Collection collection, ResponseCode responseCode) {if (collection == null || collection.isEmpty()) {throw new BusinessException(responseCode);}}public static void isEq(String str1, String st2, ResponseCode responseCode) {if (!str1.equals(st2)) {throw new BusinessException(responseCode);}}public static void isEqIgnoreCase(String str1, String str2, ResponseCode responseCode) {if (!str1.equalsIgnoreCase(str2)) {throw new BusinessException(responseCode);}}public static void smallerThan(Long second, int i, ResponseCode responseCode) {if (second > i) {throw new BusinessException(responseCode);}}
}

全局异常处理类,不再写大量try - catch,由全局异常处理类自动捕获

@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(BusinessException.class)public AjaxResult businessExceptionHandler(BusinessException e) {e.printStackTrace();return AjaxResult.me().setSuccess(false).setMessage(e.getMessage()).setCode(e.getCode());}//JSR-303校验所抛出的异常@ExceptionHandler(MethodArgumentNotValidException.class)public AjaxResult MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {e.printStackTrace();BindingResult bindingResult = e.getBindingResult();List<ObjectError> allErrors = bindingResult.getAllErrors();StringBuffer sb = new StringBuffer();allErrors.forEach(objectError -> sb.append(objectError.getDefaultMessage()).append("! "));return AjaxResult.me().setSuccess(false).setMessage(sb.toString()).setCode(ResponseCode.RESPONSE_CODE_400.getCode());}@ExceptionHandler(Exception.class)public AjaxResult ExceptionHandler(Exception e) {e.printStackTrace();return AjaxResult.me().setSuccess(false).setMessage(ResponseCode.RESPONSE_CODE_500.getMessage()).setCode(ResponseCode.RESPONSE_CODE_500.getCode());}
}

在使用dto接受前端参数时,可以使用JSR-303校验

@Data
public class PlaceOrderDTO {private String parentOrderNo;@NotNull(message = "请选择收货地址") // 当为空时会报错 -> "请选择收货地址"private OrderGiftAddress address;}

可以将异常信息定义在properties中在resources包下ValidationMessages.properties配置文件中,将中文转换为Unicode转义序列的UTF-16编码格式

example.error.blank     = \u4e0d\u80fd\u4e3a\u7a7a
\u4e0d 表示中文字符“不”。
\u80fd 表示中文字符“能”。
\u4e3a 表示中文字符“为”。
\u7a7a 表示中文字符“空”。

ValidationMessages.properties配置文件原本是在org.hibernate.validator包下的,因为javaapi中只定义了jsr303规范,具体实现是由其他包实现的,springboot-starter下是由org.hibernate.validator来实现的

@NotBlank(message = "${example.error.blank}")private String username;

在controller接口参数位置打上@Valid,JSR303才能生效

 @PostMapping("/placeorder")public AjaxResult placeOrder(@Valid @RequestBody PlaceOrderDTO dto) {orderGiftService.placeOrder(dto);return AjaxResult.me().setResultObj(dto.getUniPayOrderSn());}```

相关文章:

异常处理总结

自定义异常 ​ 系统中的异常可以分为我们能预知的异常和未知的系统异常&#xff0c;对于我们能预知的异常如空值判断&#xff0c;用户名错误&#xff0c;密码错误等异常我们需要返回客户端&#xff0c;对于系统内部异常如SQL语法错误&#xff0c;参数格式转换错误等需要统一包…...

大模型日报2024-06-18

大模型日报 2024-06-18 大模型资讯 大模型产品 Olvy 3.0&#xff1a;AI加速客户反馈分析 摘要: Olvy 3.0推出AI自动监听和智能标签功能&#xff0c;通过Google Meet集成轻松提取洞察&#xff0c;贴近客户&#xff0c;激发同理心。 PlantIdentify-免费植物识别应用 摘要: PlantI…...

NumPy 双曲函数与集合操作详解

NumPy 双曲函数 NumPy 提供了 sinh()、cosh() 和 tanh() 等 ufunc&#xff0c;它们接受弧度值并生成相应的双曲正弦、双曲余弦和双曲正切值。 示例&#xff1a; import numpy as npx np.sinh(np.pi/2)print(x)示例 找到数组 arr 中所有值的双曲余弦值&#xff1a; import…...

ABSD-系统架构师(十三)

1、CDN和反向代理的基本原理都是&#xff08;&#xff09;。 A缓存 B负载均衡 C路由转发 DNAT转发 答案&#xff1a;A 2、&#xff08;必考&#xff09;在ABSD&#xff08;基于架构的软件开发&#xff09;方法中&#xff0c;顶层被分解为&#xff08;&#xff09;&#xff…...

PLC通过Profibus协议转Modbus协议网关接LED大屏通讯

一、背景 Modbus协议和Profibus协议是两种常用于工业控制系统的通信协议&#xff0c;它们在自动化领域中起着重要的作用。Modbus是一种串行通信协议&#xff0c;被广泛应用于各种设备之间的通信&#xff0c;如传感器、执行器、PLC等。而Profibus则是一种现场总线通信协议&…...

第二十三篇——香农第二定律(二):到底要不要扁平化管理?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 对于企业的理解&#xff0c;扁平化的管理&#xff0c;如果从香农第二定律…...

stm32f103 HAL库 HC-SR04测距

目录 一、实现测距二、添加TIM3控制LED根据距离以不同频率闪烁三、观察时序Modebus协议12路超声波雷达设计方案1. 系统架构设计2. 硬件设计3. 软件设计4. 通信协议设计5. 用户接口6. 安全和冗余7. 测试和验证8. 电源和物理封装9. 文档和支持 一、实现测距 配置时钟 配置定时器…...

vue中通过自定义指令实现一个可拖拽,缩放的弹窗

效果 功能描述 按住头部可拖拽鼠标放到边框&#xff0c;可缩放多层重叠丰富的插槽&#xff0c;易于扩展 示例 指令代码 export const dragDialog {inserted: function (el, { value, minWidth 400, minHeight 200 }) {// 让弹窗居中let dialogHeight el.clientHeight ?…...

FreeRtos-09事件组的使用

1. 事件组的理论讲解 事件组:就是通过一个整数的bit位来代表一个事件,几个事件的or和and的结果是输出 #define configUSE_16_BIT_TICKS 0 //configUSE_16_BIT_TICKS用1表示16位,用0表示32位 1.1 事件组适用于哪些场景 某个事件若干个事件中的某个事件若干个事件中的所有事…...

多路h265监控录放开发-(1)建立head窗口并实现鼠标拖动整个窗口

头文件&#xff1a; //鼠标事件 用于拖动窗口//一下三个函数都是QWidget的可重载成员函数void mouseMoveEvent(QMouseEvent* ev) override;void mousePressEvent(QMouseEvent* ev) override;void mouseReleaseEvent(QMouseEvent* ev) override; 源文件&#xff1a; / /// 鼠标…...

ICMR 2024在普吉岛闭幕,学者与泰国舞者共舞,燃爆全场

惊艳&#xff01;ICMR 2024在普吉岛闭幕&#xff0c;学者与泰国舞者共舞&#xff0c;燃爆全场&#xff01; 会议之眼 快讯 ICMR&#xff08;International Conference on Multimedia Retrieval&#xff09;即国际多媒体检索会议&#xff0c;是一个专注于多媒体检索领域的顶级…...

大模型精调:实现高效迁移学习的艺术

在人工智能领域&#xff0c;大型预训练模型&#xff08;以下简称“大模型”&#xff09;已经取得了令人瞩目的成果。这些模型通过在海量数据上进行预训练&#xff0c;能够捕捉到丰富的特征信息&#xff0c;为各种下游任务提供强大的支持。然而&#xff0c;如何将这些大模型应用…...

epoll服务端和客户端示例代码

epoll 服务端demo #include <stdio.h> #include <sys/epoll.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <arpa/inet.h> #include <fcntl.h> #include <unistd.h> #include <ne…...

最大乘积和-第13届蓝桥杯省赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第85讲。 最大乘积和&#…...

探索C嘎嘎的奇妙世界:第四关---引用与内联函数

1 引用: 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。 #include<iostream> using namespace std;int main() {int a 0;// 引用&#xff1a;…...

DLS平台:惠誉全球经济展望——今年调增至2.6%,明年调减!

摘要 尽管全球货币政策逐渐转向宽松&#xff0c;惠誉国际评级&#xff08;Fitch Ratings&#xff09;在最新的《全球经济展望》中对2024年全球经济增长进行了上调。然而&#xff0c;由于美国经济增速放缓和其他因素的影响&#xff0c;2025年的全球经济增长预期则被下调。这篇文…...

数据结构习题

第一章 绪论 与数据元素本身的形式、内容、相对位置、个数无关的是数据的 逻辑结构。 第二章 线性表 在一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变&#xff0c;平均要移动的元素个数为 63.5。 n/2 单链表的存储密度 小于1。 创建一个包括n个结点的有序单链…...

交通银行软件开发工程师校招面试经历

本文介绍2024届春招中&#xff0c;交通银行总行的软件开发工程师岗位1场面试的基本情况、提问问题等。 2024年04月投递了交通银行总行的软件开发工程师岗位&#xff0c;暂时不清楚所在部门。目前完成了一面&#xff0c;并进入体检阶段&#xff1b;在这里记录一下面试的相关经历…...

bashrc和profile区别

作用与目的&#xff1a; .bashrc&#xff1a;这个文件主要用于配置和自定义用户的终端环境和行为。每次启动新的终端时&#xff0c;.bashrc文件都会被执行&#xff0c;加载用户设置的环境变量、别名、函数等。这使得用户能够根据自己的喜好和需求来定制终端的行为和外观。profi…...

BC153 [NOIP2010]数字统计

数字统计 一.题目描述二.输入描述&#xff1a;三.输出描述&#xff1a;四.数字范围五.题目思路六.代码实现 一.题目描述 请统计某个给定范围[L, R]的所有整数中&#xff0c;数字2出现的次数。 比如给定范围[2, 22]&#xff0c;数字2在数2中出现了1次&#xff0c;在数12中出现1次…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...