Java中如何自定义异常进行抛出,并且定义全局异常处理类进行捕获异常(详细讲解)?

1.先理解为什么要抛出异常?

 一句话就是为了终止程序,一般是终止业务层也就是service层。

2.为什么要自定义异常抛出?

因为系统提供的异常种类很多,而且代表的含义很多,所以我们需要自己定义一个通用的异常,然后只要是业务层的异常我都抛出这个,只是给它不同的提示信息进行区别。其实大部分业务层抛出异常只是为了快速终止程序,提示给用户到底发生了什么错误。

3.为什么要进行全局异常捕获处理?

(1)如果不捕获当然也可以,但是很不友好,第一请求的响应结果是一个错误页面的标签,并且在控制台会直接打印出一堆很乱的错误信息的追踪。如图:

(2)所以一般情况下还是要捕获,但是很多人可能好奇,try catch不是能捕获吗?虽然能捕获但是不能终止异常,它后面的代码依然会执行,并且全局的异常也没办法做,一般只有编译器异常才会用try catch 例如文件找不到,因为不try catch程序一直报错,一般这种我们也是在catch里面重新抛出我们自定义的异常,然后再进行全局异常捕获。
(3)全局异常捕获的好处,第一可以指定捕获到的全局异常,然后还可以定义响应码和响应结果进行返回,不会出现刚才响应一个html标签奇怪的东西,第二不会在控制台打印出那个异常的错误信息,也很友好。

4.项目中如何自定义异常和全局捕获(实战)

(1)自定义业务层异常ServiceException放在exception包下面

一般包括错误码code和msg,此处多了一个响应枚举ResponseEnum,是因为有些错误很常见,可以统一提前定义在枚举里面,以后写的时候可以直接new throw ServiceException(ResponseEnum.xxx)更方便一些,当然一般情况下还是直接传入code和msg

package com.fzy.exception;import com.fzy.constant.ResponseEnum;
import lombok.Data;@Data
public class ServiceException extends RuntimeException {private ResponseEnum responseEnum;private Integer code;private String msg;public ServiceException(ResponseEnum responseEnum) {super(responseEnum.getMessage());this.responseEnum = responseEnum;this.code = responseEnum.getCode();this.msg = responseEnum.getMessage();}public ServiceException(Integer code, String msg) {super(msg);this.code = code;this.msg = msg;}public ServiceException(String msg) {super(msg);this.code = ResponseEnum.FAILURE.getCode();this.msg = msg;}
}

(2)响应的异常枚举ResponseEnum

package com.fzy.constant;import lombok.AllArgsConstructor;
import lombok.Getter;@AllArgsConstructor
@Getter
public enum ResponseEnum {SUCCESS(200,"成功"),FAILURE(500,"服务器错误"),FILE_SIZE_ERROR(500, "文件大小异常");private Integer code;private String message;
}

(3)返回给前端的ResponseVO

package com.fzy.result;import com.fzy.constant.ResponseEnum;
import lombok.Data;@Data
public class ResponseVO<T> {private Integer code;private String message;private T data;public ResponseVO(ResponseEnum resultEnum) {this.code = resultEnum.getCode();this.message = resultEnum.getMessage();}public ResponseVO(Integer code, String message) {this.code = code;this.message = message;}public ResponseVO(Integer code, String message, T data) {this.code = code;this.message = message;this.data = data;}public ResponseVO(T data) {this.data = data;}
}

(4)全局异常处理类SystemGlobalExceptionHandler,放到handler包下面

其中@ExceptionHandler主要是表明捕获哪个异常,可以给参数进行指定,e.getMessage是它父类的方法,并且我们在 new ServiceException时调用的super方法就是给父类中的Message赋值。

package com.fzy.handler;import com.fzy.exception.ServiceException;
import com.fzy.result.ResponseVO;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;@RestControllerAdvice
public class SystemGlobalExceptionHandler {@ExceptionHandler(value = RuntimeException.class)public ResponseVO exceptionHandler(ServiceException e){System.out.println(e.getMessage());if (e.getResponseEnum() != null) {return new ResponseVO<>(e.getResponseEnum());} else {return new ResponseVO<>(e.getCode(), e.getMsg());}}
}

总结:上面这种写法是为了更好的封装和规范开发,多理解一下,一般只在Service层进行抛出异常终止程序。

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

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

相关文章

白帽子最喜欢用什么渗透测试工具?看看哪些是你用过的

一、白帽子最喜欢用什么安全工具? 2020 年的 HackerOne 黑客报告中,统计过白帽子们最喜欢用的软硬件工具。 从图中可以看到,89% 的白帽子都会使用 Burp Suite 这个 Web 应用安全测试工具,有 39% 会尝试自己写工具,第三名的 Fuzzers 是模糊测试工具。再后面主要是一些代理…

STM32-17-DAC

STM32-01-认识单片机 STM32-02-基础知识 STM32-03-HAL库 STM32-04-时钟树 STM32-05-SYSTEM文件夹 STM32-06-GPIO STM32-07-外部中断 STM32-08-串口 STM32-09-IWDG和WWDG STM32-10-定时器 STM32-11-电容触摸按键 STM32-12-OLED模块 STM32-13-MPU STM32-14-FSMC_LCD STM32-15-DMA…

k8s学习--OpenKruise详细解释以及原地升级及全链路灰度发布方案

文章目录 OpenKruise简介OpenKruise来源OpenKruise是什么&#xff1f;核心组件有什么&#xff1f;有什么特性和优势&#xff1f;适用于什么场景&#xff1f; 什么是OpenKruise的原地升级原地升级的关键特性使用原地升级的组件原地升级的工作原理 应用环境一、OpenKruise部署1.安…

ThreadLocal 详讲

ThreadLocal ThreadLocal是一个将在多线程中为每一个线程创建单独的变量副本的类; 当使用ThreadLocal来维护变量时, ThreadLocal会为每个线程创建单独的变量副本, 避免因多线程操作共享变量而导致的数据不一致的情况。 ThreadLocal 使用 public class ThreadLocalTest {priv…

ssm宠物网站系统-计算机毕业设计源码07183

摘 要 在信息飞速发展的今天&#xff0c;网络已成为人们重要的信息交流平台。宠物网站每天都有大量的信息需要通过网络发布&#xff0c;为此&#xff0c;本人开发了一个基于B/S&#xff08;浏览器/服务器&#xff09;模式的宠物网站系统。 该系统以JJava编程语言、MySQL和SSM框…

Linux sudo -i取消密码的方法

直接修改 /etc/sudoers 文件来实现 sudo -i 无需密码的配置。以下是具体步骤&#xff1a; 步骤 打开终端并使用 visudo 命令编辑 /etc/sudoers 文件 使用 visudo 编辑 sudoers 文件是推荐的方法&#xff0c;因为它会在保存前进行语法检查&#xff0c;防止出现配置错误。 sudo …

基于 VITA57.1 标准的 2 收 2 发射频子卡(国产 ADRV9009子卡)

FMC159 是一款基于 VITA57.1 标准规范&#xff0c;实现 2 收 2 发的射频子模块&#xff0c;该板卡基于国产化 ADRV9009 射频收发器&#xff0c;涵盖了50MHz~6GHz 频段&#xff0c;并集成了双通道收发链路&#xff0c;发送最大实时带宽可到 450MHz&#xff0c;接收最大带宽可以到…

十进制、二进制、十六进制之间的相互转换

实验目的 实现int 、float 转换为字符串并显示 实现数字字符以二进制、十进制、十六进制显示 实现十进制、二进制、十六进制之间的相互转换 #include "numconvert.h" #include "ui_numconvert.h"NumConvert::NumConvert(QWidget *parent): QWidget(parent)…

C#特性-CallerMemberName、CallerFilePath和CallerLineNumber的介绍和应用

介绍 在csharp中&#xff0c;CallerMemberName, CallerFilePath, 和 CallerLineNumber 是编译时常量&#xff0c;它们是csharp 5.0引入的特性&#xff0c;用于提供有关调用堆栈的信息&#xff0c;通常用于日志记录和调试。这些特性可以自动填充方法的参数&#xff0c;无需显式…

软考初级网络管理员__网络单选题

1.观察交换机状态指示灯初步判断交换机故障&#xff0c;交换机运行中指示灯显示红色表示()。 警告 正常 待机 繁忙 2.通常测试网络连通性采用的命令是()。 Netstat Ping Msconfig Cmd 3.一台16端口的交换机可以产生&#xff08;&#xff09;个冲突域? 1 4 15 16…

jQuery 常用函数解析

简介 jQuery 是一个流行的 JavaScript 库&#xff0c;它极大地简化了网页开发中的常见任务。在本文中&#xff0c;我们将深入探讨 jQuery 中一些非常有用的函数&#xff0c;包括 parent、find、siblings、prop、hasClass、removeClass、addClass、empty、append、text、val、r…

安装 Nuxt.js 的步骤和注意事项

title: 安装 Nuxt.js 的步骤和注意事项 date: 2024/6/17 updated: 2024/6/17 author: cmdragon excerpt: Nuxt.js在Vue.js基础上提供的服务器端渲染框架优势&#xff0c;包括提高开发效率、代码维护性和应用性能。指南详细说明了从环境准备、Nuxt.js安装配置到进阶部署技巧&…

3D元宇宙虚拟主播引领文旅产业迈向更加美好的未来!

随着文旅产业的蓬勃发展&#xff0c;3D数字代言人的应用正逐渐改变着传统的文旅传播方式。文旅3D数字代言人搭建编辑器的出现&#xff0c;正是满足大部分文旅产业借助数字人浪潮&#xff0c;将传统文化与现代科技完美融合的创新之举。 文旅3D数字代言人搭建编辑器不仅满足了Z世…

SelfGNN: Self-Supervised Graph Neural Networks for Sequential Recommendation

SelfGNN: Self-Supervised Graph Neural Networks for Sequential Recommendation&#xff08;Sigir2024&#xff09; 摘要 顺序推荐通过对用户的时间和顺序交互模式进行建模&#xff0c;有效地解决信息过载问题。 为了克服监督信号的局限性&#xff0c;最近的方法在推荐系统中…

奇安信齐向东:AI驱动安全,应对数字经济时代挑战

随着数字经济的蓬勃发展&#xff0c;网络安全问题日益凸显&#xff0c;AI技术的融入为网络安全带来了新的机遇和挑战。近日&#xff0c;备受瞩目的2024全球数字经济大会数字安全高层论坛暨北京网络安全大会战略峰会&#xff08;简称“BCS大会”&#xff09;在北京盛大开幕。本次…

GPT-4o的视觉识别能力,将绕过所有登陆的图形验证码

知识星球&#x1f517;除了包含技术干货&#xff1a;《Java代码审计》《Web安全》《应急响应》《护网资料库》《网安面试指南》还包含了安全中常见的售前护网案例、售前方案、ppt等&#xff0c;同时也有面向学生的网络安全面试、护网面试等。 我们来看一下市面上常见的图形验证…

3、双分支判断 - 课件

一、双分支的基本语法结构 双分支结构,也称为if-else语句,其基本语法如下: if (判断表达式) {// 条件为真时执行的代码块 } else {// 条件为假时执行的代码块 }说明: 判断表达式是一个布尔表达式,它的值为真(true)或假(false)。如果判断表达式的值为真,执行if后面的代码块;如…

Redis:原理、概念、用法与实例解析

Redis&#xff1a;原理、概念、用法与实例解析 在当今风起云涌的技术领域中&#xff0c;Redis 犹如一颗璀璨的明星&#xff0c;闪耀着独特的光芒。它作为一种备受瞩目的数据存储和缓存解决方案&#xff0c;以其卓越的性能、丰富多样的功能以及简单易用的特性&#xff0c;成为了…

【WEEK16】学习目标及总结【Spring Boot】【中文版】

学习目标&#xff1a; 学习SpringBoot 学习内容&#xff1a; 参考视频教程【狂神说Java】SpringBoot最新教程IDEA版通俗易懂Dubbo和Zookeeper集成 学习时间及产出&#xff1a; 第十六周TUE~FRI 2024.6.11【WEEK16】 【DAY2】Dubbo和Zookeeper集成第二部分【中文版】【WEEK16…

3秒生成!这个AI模型画风也太治愈了,新手也能轻松驾驭

还在为不会画画而苦恼吗&#xff1f;别担心&#xff0c;今天给大家介绍一个超好用的AI模型——Soft and Squishy Linework&#xff0c;即使是小白也能轻松生成可爱的动漫图像&#xff01; Soft and Squishy Linework&#xff1a;专门生成柔和的、低保真&#xff08;lofi&#…