Springboot全局异常处理

Springboot全局异常处理

  • 一、不使用全局异常处理器
  • 二、全局异常处理器
    • 1.自定义常量(返回状态码)
    • 2.手动抛出异常
    • 3.编写全局异常处理器
    • 4.测试结果
  • 三、全局异常处理方式二
    • 1.定义状态码常量
    • 2. 定义基础接口(面向接口编程)
    • 3.定义枚举类
    • 4.自定义数据传输对象
    • 5.定义全局异常处理器
    • 6.测试1
    • 7.测试2
  • 四、值得参考的博客


为什么使用全局异常?

  • 在开发过程中,不管是 Dao、Servie、Controller,层都有可能发生异常,对于异常处理,通常是 try-catch 或者直接 throw,这会让 try-catch 的代码在代码中任意出现,系统的代码耦合度高,代码不美观,统一异常处理可以美化代码。

如何使用全局异常?

  • 在后端处理请求过程中发生了异常,DispatcherServlet 将异常处理委托给异常处理器(处理异常的类)。实现 HandlerExceptionResolver 接口的都是异常处理类。
  • 项目的异常一般集中处理,定义全局异常处理器。再结合框架提供的注解,诸如:@ExceptionHandler@ControllerAdvice@RestControllerAdvice 一起完成异常的处理。注意: 一定要和Controller中的注解(@Controller 和 RestController)保持一致性。
  • @ControllerAdvice@RestControllerAdvice 区别在于:@RestControllerAdvice 加了@RepsonseBody

一、不使用全局异常处理器

  • ① 编写控制器相关的代码,模拟出现了空指针异常。NullPointerException

    @RestController
    public class Controller {@GetMapping("/divide")public String divide(){String str = null;str.toString();return "success";}
    }
    
  • ② 发送请求返回结果查看。
    在这里插入图片描述


二、全局异常处理器

  • SpringBoot中,@ControllerAdvice 或 @RestControllerAdvice 即可开启全局异常处理,使用该注解表示开启了全局异常的捕获,我们只需在自定义一个方法使用@ExceptionHandler注解然后定义捕获异常的类型即可对这些捕获的异常进行统一的处理。

1.自定义常量(返回状态码)

/*** 返回状态码的常量**/
public class StatusCodeConstant {public static final Integer ERROR = 500; //服务器非法错误
}

2.手动抛出异常

@RestController
public class Controller {@GetMapping("/divide")public String divide(){String str = null;str.toString();return "success";}
}

3.编写全局异常处理器

    /*** 处理空指针的异常*/@ExceptionHandler(NullPointerException.class)@ResponseBodypublic String exceptionHandler(NullPointerException e){return "<h1>服务器出现错误,请联系管理员 ====> " + e.getMessage() + "</h1>";}

4.测试结果

在这里插入图片描述

  • 建议在参数签名中尽可能具体异常类,以减少异常类型和原因异常之间不匹配的问题,考虑创建多个@ExceptionHandler 方法的,每个方法通过其签名匹配单个特定的异常类型。最后增加一个根异常,考虑没有匹配的其他情况。

三、全局异常处理方式二

1.定义状态码常量

public class StatusCodeConstant {public static final Integer SUCCESS = 200;  //返回状态正常public static final Integer ERROR = 0; //返回错误
}

2. 定义基础接口(面向接口编程)

/*** 响应信息的基础接口**/
public interface ResponseResultBaseInfo {/***  错误码*/Integer getResultCode();/*** 错误描述*/String getResultMsg();
}

3.定义枚举类

/*** 异常处理枚举类*/
public enum ResponseEnum implements ResponseResultBaseInfo{// 数据操作错误定义SUCCESS(200, "success"),ERROR(500,"error");/*** 错误码*/private final Integer resultCode;/*** 错误描述*/private final String resultMsg;ResponseEnum(Integer resultCode, String resultMsg) {this.resultCode = resultCode;this.resultMsg = resultMsg;}@Overridepublic Integer getResultCode() {return resultCode;}@Overridepublic String getResultMsg() {return resultMsg;}
}

4.自定义数据传输对象

/*** 自定义数据传输对象*/
@Data
public class ResponseResult {/*** 响应代码*/private Integer code;/*** 响应消息*/private String message;/*** 响应结果*/private Object result;public ResponseResult(){}public ResponseResult(ResponseResultBaseInfo res) {this.code = res.getResultCode();this.message = res.getResultMsg();}/*** 成功*/public static ResponseResult success() {return success(null);}/*** 成功*/public static ResponseResult success(Object data) {ResponseResult responseResult = new ResponseResult();responseResult.setCode(ResponseEnum.SUCCESS.getResultCode());responseResult.setMessage(ResponseEnum.SUCCESS.getResultMsg());responseResult.setResult(data);return responseResult;}/*** 失败*/public static ResponseResult error(ResponseResultBaseInfo res) {ResponseResult responseResult = new ResponseResult();responseResult.setCode(res.getResultCode());responseResult.setMessage(res.getResultMsg());responseResult.setResult(null);return responseResult;}/*** 失败*/public static ResponseResult error(Integer code, String message) {ResponseResult responseResult = new ResponseResult();responseResult.setCode(code);responseResult.setMessage(message);responseResult.setResult(null);return responseResult;}/*** 失败*/public static ResponseResult error(String message) {ResponseResult responseResult = new ResponseResult();responseResult.setCode(StatusCodeConstant.ERROR);responseResult.setMessage(message);responseResult.setResult(null);return responseResult;}}

5.定义全局异常处理器

/*** 全局异常处理器**/
@RestControllerAdvice 
public class ExceptionHandlerConfig {@ExceptionHandler(NullPointerException.class)public ResponseResult nullPointException(NullPointerException e) {return ResponseResult.error(e.getMessage());}@ExceptionHandler(Exception.class)public ResponseResult exception() {return ResponseResult.error(ResponseEnum.ERROR);}
}

6.测试1

    @GetMapping("/latest")public ResponseResult getSensorDataLatest() {return ResponseResult.success("数据传输成功");}

在这里插入图片描述

7.测试2

    @GetMapping("/latest")public ResponseResult getSensorDataLatest() {int a = 1;if(a == 1)throw new ArithmeticException();return ResponseResult.success("数据传输成功");}

在这里插入图片描述


四、值得参考的博客

  • Spring Boot项目优雅的全局异常处理方式(全网最新)
  • Spring的@ExceptionHandler注解使用方法
  • SpringBoot全局异常处理(优缺点)以及统一返回对象、错误码按业务模块设计示例,序列化后与数据库数据时间差8小时

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

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

相关文章

湖南麒麟SSH服务漏洞

针对湖南麒麟操作系统进行漏洞检测时&#xff0c;会报SSH漏洞风险提醒&#xff0c;具体如下&#xff1a; 针对这些漏洞&#xff0c;可以关闭SSH服务&#xff08;前提是应用已经部署完毕不再需要通过SSH远程访问传输文件的情况下&#xff0c;此时可以通过VNC远程登录方法&#x…

JMeter基础 — JMeter聚合报告详解

提示&#xff1a;聚合报告组件的使用和察看结果树组件的使用方式相同。本篇文章主要是详细的介绍一下聚合报告组件内容&#xff0c;不做示例演示。 1、聚合报告介绍 在使用JMeter进行性能测试时&#xff0c;聚合报告(Aggregate Report)可以说是必用的监听器。 &#xff08;1&…

Internet协议的安全性

Internet协议的安全性 文章目录 Internet协议的安全性1. 网络层1. IP*62. ARP*33. ICMP * 3 2. 传输层协议1. TCP1. * SYN-Flood攻击攻击检测* 防御 2. TCP序号攻击攻击 3. 拥塞机制攻击 2. UDP 3. 应用层协议1. DNS攻击*3防范*3: 2. FTP3. TELNET: 改用ssh4. 电子邮件1. 攻击2…

【Javascript编程实操06】1、反转数组和字符串 2、将二维数组转一维数组

前言 1、反转数组和字符串 代码&#xff1a; 实现效果&#xff1a; 2、将二维数组转一维数组 代码&#xff1a; 实现效果&#xff1a; 总结 前言 本次主要是针对Javascript阶段的字符串与数组的实操练习&#xff0c;共有2个实操&#xff0c;大家可以在实操的过程中更加深…

什么时候去检测大数据信用风险比较合适?

什么时候去检测大数据信用风险比较合适?在当今这个数据驱动的时代&#xff0c;大数据信用风险检测已经成为个人的一项重要需求。本文将从贷前检测、信息泄露检测和定期检测三个方面&#xff0c;阐述何时进行大数据信用风险检测较为合适。 一、贷前检测 大数据信用风险检测在贷…

Docker使用(二)Docker安装和常见典型操作

Docker使用(二)Docker安装和常见典型操作 二、软件安装 1、Docker安装 &#xff08;1&#xff09;环境准备 [rootlocalhost ~]# uname -r 3.10.0-327.el7.x86_64 # cat /etc/os-release &#xff08;2&#xff09;卸载旧版本 $ sudo yum remove docker \ ​ docker-cli…

折半搜索.

折半搜索 知识点折半搜索的原理折半搜索的过程 例题题目&#xff1a;世界冰球锦标赛题目描述输入样例输出样例提示 世界冰球锦标赛题解思路代码 知识点 折半搜索的原理 折半搜索是一种技巧&#xff0c;实际上就是将一个次搜索过程分成两次进行&#xff0c;然后将两次搜索的结果…

145 Linux 网络编程1 ,协议,C/S B/S ,OSI 7层模型,TCP/IP 4层模型,

一 协议的概念 从应用的角度出发&#xff0c;协议可理解为“规则”&#xff0c;是数据传输和数据的解释的规则。 典型协议 传输层 常见协议有TCP/UDP协议。 应用层 常见的协议有HTTP协议&#xff0c;FTP协议。 网络层 常见协议有IP协议、ICMP协议、IGMP协议。 网络接口层 常…

作业-逆序和定位

目录 字符串逆序 题目描述 输入 输出 样例 解题思路&#xff1a; 单词倒排 题目描述 输入 输出 样例 解题思路&#xff1a; 首字母大写 题目描述 输入 输出 样例 解题思路&#xff1a; 统计句子中单词个数 题目描述 输入 输出 样例 解题思路&#xff1a; 大小写字母互换 题目描…

springboot“涛宝”大学生二手物品交易商城

摘 要 二十一世纪我们的社会进入了信息时代&#xff0c;信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多&#xff0c;而在线管理系统刚好能满足这些需求&#xff0c;在线管理系统突破了传统管理方式的局限性。于是本文针对这一…

Kubernetes operator系列:webhook 知识学习

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes operator学习 系列文章&#xff0c;本节会对 kubernetes webhook 知识进行学习 本文的所有代码&#xff0c;都存储于github代码库&#xff1a;https://github.com/graham924/share-code-operator-st…

免费接口调用 招标信息自动抽取|招标信息|招标数据解析接口

一、开源项目介绍 一款多模态AI能力引擎&#xff0c;专注于提供自然语言处理&#xff08;NLP&#xff09;、情感分析、实体识别、图像识别与分类、OCR识别和语音识别等接口服务。该平台功能强大&#xff0c;支持本地化部署&#xff0c;并鼓励用户体验和开发者共同完善&#xf…

浅谈性能测试中的基准测试

在性能测试中有一种测试类型叫做基准测试。这篇文章&#xff0c;就聊聊关于基准测试的一些事儿。 1、定义 通过设计合理的测试方法&#xff0c;选用合适的测试工具和被测系统&#xff0c;实现对某个特定目标场景的某项性能指标进行定量的和可对比的测试。 2、特质 ①、可重…

软件实例,餐厅酒水寄存管理系统软件,酒水寄存登记表软件操作教程

软件实例&#xff0c;餐厅酒水寄存管理系统软件&#xff0c;酒水寄存登记表软件操作教程 一、前言 以下软件操作以 佳易王酒水寄存管理系统软件V16.0为例说明 件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、酒水寄存管理系统软件可以管理多个品类的物…

SendMessage 和 PostMessage 有什么区别?

SendMessage和PostMessage都是Windows编程中用于进程间通信或同一进程内不同线程间通信的函数&#xff0c;用于向窗口发送消息。尽管这两个函数的目的相似&#xff0c;但它们在实现方式和行为上存在一些关键差异。 同步与异步&#xff1a; SendMessage是一个同步消息发送函数。…

用 C 语言模拟 Rust 的 Result 类型

在 Rust 中&#xff0c;Result<T, E> 类型是一个枚举&#xff0c;它表示一个操作可能成功并返回一个值 T&#xff0c;或者失败并返回一个错误 E。在 C 语言中&#xff0c;没有直接对应的 Result 类型&#xff0c;但我们可以使用结构体和枚举来模拟它。 下面是一个用 C 语…

AI健身教练-引体向上-俯卧撑计数-仰卧起坐姿态估计-康复训练姿态识别-姿态矫正

在AI健身应用中&#xff0c;通过关键点检测技术可以实现对用户动作的精准捕捉和分析&#xff0c;从而进行统计计数和规范性姿态识别。 统计计数&#xff1a;比如在做瑜伽、健身操等运动时&#xff0c;系统可以通过对人体关键点&#xff08;如手部、脚部、关节等&#xff09;的…

复习 --- windows 上安装 git,使用相关命令

文章目录 很少使用windows的git工具&#xff0c;这次借助这个任务&#xff0c;记录下使用过程&#xff0c;其他的等有空在整理。 其中&#xff0c;还使用了浏览器的AI小助手&#xff0c;复习了git相关的命令&#xff1a;图片放最后

ROS——集成开发环境搭建

1.4 ROS集成开发环境搭建 和大多数开发环境一样&#xff0c;理论上&#xff0c;在 ROS 中&#xff0c;只需要记事本就可以编写基本的 ROS 程序&#xff0c;但是工欲善其事必先利其器&#xff0c;为了提高开发效率&#xff0c;可以先安装集成开发工具和使用方便的工具:终端、ID…

C++ 虚函数表

虚函数表 当一个类中声明了虚函数时&#xff0c;这个函数在编译时会被标记为虚函数&#xff0c;并且对应的虚函数表中会为这个类生成一个虚函数表&#xff1b; 当基类指针指向派生类对象时&#xff0c;如果这个函数被调用&#xff0c;实际上调用的是派生类中的函数。这是因为…