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

如何搭建springBoot项目中的全局异常处理和自定义异常处理

目录

1 什么是异常

2 异常的种类

3 解决异常的方式

4 全局异常处理器和自定义异常处理器

5 测试异常处理


1 什么是异常

异常(Exception)是在程序执行过程中出现的一种特殊情况或错误。它可以是由于程序逻辑错误、运行环境问题、用户输入错误等原因导致的一种非正常的状态或事件

在编程领域中,异常通常用来表示一种无法预料或处理的情况,它会导致程序无法继续正常执行。当程序运行过程中遇到异常,如果没有适当的处理机制,可能会导致程序崩溃或产生未预期的结果。

2 异常的种类

Checked Exception(已检查异常):这类异常是在编译时强制要求程序员进行处理的异常,如文件未找到、数据库连接失败等。Java 中的 checked exception 必须在方法签名中声明,或者使用 try-catch 块进行捕获处理,否则编译不通过。

Unchecked Exception(未检查异常):也称为运行时异常(RuntimeException),通常是由于编程错误或者运行环境出现问题引起的异常,如空指针异常(NullPointerException)、数组越界异常(ArrayIndexOutOfBoundsException)等。编译器不要求强制捕获或者声明这类异常,程序员可以选择捕获和处理,但不是必须的

处理异常的主要目的是为了保证程序的稳定性和可靠性。通常的处理方式包括捕获异常、记录异常信息、恢复程序状态、通知用户等。

3 解决异常的方式

1、捕获和处理异常(try-catch)

  • 使用 try-catch 块来捕获可能抛出异常的代码块。
  • try 块中编写可能引发异常的代码,然后在 catch 块中处理异常。
  • 这种方式适用于已检查异常(checked exception),以及可以预料到可能出现的异常情况

2、抛出异常(throw)

  • 在方法中使用 throw 关键字抛出异常,告知调用者可能发生的异常情况。
  • 通常在方法内部检测到无法处理的情况时抛出异常,将问题交给上层调用者处理。

3、使用 finally 块

  • finally 块中的代码总是会被执行,无论是否抛出异常,用于释放资源或者确保某些操作一定会执行。

4、使用 try-with-resources

  • 对于实现了 AutoCloseable 接口的资源,可以使用 try-with-resources 语句,确保资源在使用后自动关闭。
  • 适用于需要手动关闭的资源管理,如文件操作、数据库连接等。

4 全局异常处理器和自定义异常处理器

全局异常处理器是一种集中处理应用程序中所有未捕获异常的机制,常用于 Web 应用程序中,以提供统一的异常处理和用户友好的错误响应。在 Java 的 Spring 框架中,可以使用 @ControllerAdvice @ExceptionHandler 注解来实现全局异常处理。在全局异常处理器中,解决了异常种类繁多以及每个业务里面都需要去处理异常,所以Spring中提供了一种上层调用的方式来进行异常处理,把数据层和业务层的异常都向上抛放到应用层来处理,这样就可以统一对异常进行处理

类:ProjectExceptionAdvice

package com.hyh.ad.common.exceptionhandler;import cn.hutool.core.date.DateTime;
import com.hyh.ad.common.core.domain.AjaxResult;
import com.hyh.ad.common.exceptions.BusinessException;
import com.hyh.ad.common.exceptions.SystemException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;/*** 异常处理切面* 处理BusinessException异常* 处理SystemException异常* @author hyh*/@Slf4j
@RestControllerAdvice
public class ProjectExceptionAdvice {/*** @param  e* @return 业务异常处理的信息*/@ExceptionHandler(BusinessException.class)public AjaxResult handleBusinessException(BusinessException e) {//记录日志log.error(e.getMessage(), e);//返回错误信息return AjaxResult.error(e.getCode(), e.getMessage());}/*** @param  e* @return 系统异常处理的信息*/@ExceptionHandler(SystemException.class)public AjaxResult handleSystemException(BusinessException e) {//记录日志log.error(e.getMessage(), e);//返回错误信息return AjaxResult.error(e.getCode(), e.getMessage());}/** * 自定义异常处理的信息* 其他异常都经过这个来处理 也可以自己来定义自己需要的异常处理* @param  e* @return */@ExceptionHandler(Exception.class)public AjaxResult doException(Exception e) {//记录日志log.error(e.getMessage(), e);//返回错误信息return AjaxResult.error(e.getMessage() + DateTime.now());}
}

其中AjaxResult请换成自己封装的用于返回数据结果的对象 

在这个类里面可以对所有的异常进行处理,包括系统异常、编译异常、运行异常、自定义异常这些异常返回相对友好的信息。

类:BusinessException 业务异常

package com.hyh.ad.common.exceptions;/*** 业务异常处理器* @author hyh*/
public class BusinessException extends RuntimeException{/** 异常消息*/private Integer code;public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public BusinessException(Integer code) {this.code = code;}public BusinessException( Integer code,String message) {super(message);this.code = code;}public BusinessException(Integer code,String message, Throwable cause) {super(message, cause);this.code = code;}public BusinessException(Throwable cause, Integer code) {super(cause);this.code = code;}public BusinessException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, Integer code) {super(message, cause, enableSuppression, writableStackTrace);this.code = code;}
}

 类:SystemException 系统异常

package com.hyh.ad.common.exceptions;
/*** 系统异常处理器* @author  hyh*/
public class SystemException extends RuntimeException{/** 异常消息*/private Integer code;public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public SystemException(Integer code) {this.code = code;}public SystemException(Integer code, String message) {super(message);this.code = code;}public SystemException(Integer code, String message, Throwable cause) {super(message, cause);this.code = code;}public SystemException(Throwable cause, Integer code) {super(cause);this.code = code;}public SystemException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, Integer code) {super(message, cause, enableSuppression, writableStackTrace);this.code = code;}
}

5 测试异常处理

 

这里就是我模拟的一个发送邮箱验证码的异常,他把异常信息返还给了前端,并且还带有异常发生的时间。

接下来 我手动模拟了一个异常 然后再次请求一下数据

可以看到 返回了我们自定义的异常信息,包括提示信息和编码 

 

相关文章:

  • golang通过go-aci适配神通数据库
  • 【全网最全】2024电工杯数学建模B题问题一14页论文+19建模过程代码+py代码+2种保奖思路+数据等(后续会更新成品论文等)
  • CCF-CSP认证 2024年3月 4.化学方程式配平
  • SpringBootWeb 篇-深入了解 Mybatis 概念、数据库连接池、环境配置和 Lombok 工具包
  • SQL、Mongo、Redis一般适用于那些场景
  • 【GO基础】1. Go语言环境搭建
  • Kafka之【生产消息】
  • 虹科案例丨VLAN不再难懂:一台转换器+交换机轻松解锁VLAN配置
  • VUE-watch和watchEffect的区别
  • 景源畅信数字:抖音小店新手该怎么做?
  • 修改MySQL root用户密码
  • Threes 特效 炫酷传送门HTML5动画特效
  • 信息系统项目管理师--八大绩效域-规划绩效域
  • 前端生成二维码
  • 微软语音使用小计
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • Android优雅地处理按钮重复点击
  • Brief introduction of how to 'Call, Apply and Bind'
  • conda常用的命令
  • go语言学习初探(一)
  • HomeBrew常规使用教程
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JavaScript-Array类型
  • java正则表式的使用
  • JS数组方法汇总
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 大快搜索数据爬虫技术实例安装教学篇
  • 解决iview多表头动态更改列元素发生的错误
  • 离散点最小(凸)包围边界查找
  • 面试总结JavaScript篇
  • 前端性能优化——回流与重绘
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 物联网链路协议
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • !$boo在php中什么意思,php前戏
  • #define
  • #pragma pack(1)
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (vue)页面文件上传获取:action地址
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • .net解析传过来的xml_DOM4J解析XML文件
  • @selector(..)警告提示
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [30期] 我的学习方法