Spring异常处理器

news2024/9/20 1:08:43

文章目录

    • 1. 异常分析
    • 2. 异常处理器
      • 2.1 异常处理器核心
      • 2.2 异常处理顺序
    • 3. 自定义异常

1. 异常分析

 问题:
  程序允许不免的在各层都可能会产生异常,我们该如何处理这些异常? 如果只是在方法里面单独使用 try… catch… 语句去一个一个的进行捕捉处理的话,那毫无疑问是不现实的,因为异常数量是非常庞大的并且对于异常的出现种类是不可预料的,于是我们可以使用Spring框架提供的异常处理器进行处理。

 解决: 使用异常处理器在表现层进行统一处理(异常通过表现层进行逐层调用, 最后也都会抛回到表现层当中, 所以一般可以写在表现层进行处理)

2. 异常处理器

2.1 异常处理器核心

@ControllerAdvice: 声明其为异常处理器类, 用来处理系统当中的异常
@ResponseBody: 声明其返回数据放在返回体当中(用于返回异常处理之后的数据交给前端)
@RestControllerAdvice = @ControllerAdvice + @ResponseBody

关键: 在每个异常处理方法的上面需要使用对应注解声明其处理异常的种类
@ExceptionHandler(xxx.class)
@ControllerAdvice // 注意此类需要让Spring配置类扫描
@ResponseBody
public class GlobalExceptionHandler {

	@ExceptionHandler(Exception.class) // 处理全部异常
	public String doException(Exception ex){ // 用形参来接收异常
		/*
			1. 记录日志(错误堆栈)
			2. 发送邮件 -- 开发人员
			3. 发送邮件 -- 运维人员
		 */
		System.out.println(ex.getMessage());
		return "发生了Exception类型的异常.....";
	}
}

  Controller层

@RestController
public class AController {

	@RequestMapping("/TestA")
	public String TestA(){
		System.out.println("This is Test A");
		int x = 1 / 0;
		return "Successful connect TestA .......";
	}
}

  处理结果
在这里插入图片描述

2.2 异常处理顺序

  异常处理若具有包含关系,则会优先匹配更精确的处理器(即优先处理子类, 若子类不匹配再逐渐向上匹配)

@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
	@ExceptionHandler(Exception.class) // 处理全部异常
	public String doException(Exception ex){ // 用形参来接收异常
		System.out.println(ex.getMessage());
		System.out.println("发生了Exception类型的异常.....");
		return "发生了Exception类型的异常.....";
	}

	@ExceptionHandler(ArithmeticException.class) // 处理算术异常
	public String doZeroException(ArithmeticException ex){ // 用形参来接收异常
		System.out.println(ex.getMessage());
		System.out.println("发生了ArithmeticException类型的异常.....");
		return "发生了ArithmeticException类型的异常.....";
	}
}

在这里插入图片描述

3. 自定义异常

  用户可以根据自己的项目设置对应特定的异常然后再进行处理

public class MyException extends Exception{
	Integer id;
	public MyException(Integer id, String message){
		super(message); // 利用父类注明异常信息
		this.id = id;
	}

	@Override
	public String toString() {
		return "异常的ID为:" + id + "\n" +
				"异常的详细信息为" + getMessage();
	}
}

@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
	@ExceptionHandler(MyException.class) // 处理自定义异常
	public String MyException(MyException ex){
		System.out.println(ex.getMessage());
		return "自定义异常";
	}

}

@RestController
public class AController {

	@RequestMapping("/TestA")
	public String TestA() throws MyException {
		System.out.println("This is Test A");
		throw new MyException(101, "101号自定义异常.....");
	}
}

在这里插入图片描述

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

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

相关文章

【JUC并发编程】读写锁:ReadWriteLock

一、介绍 二、代码演示 1. 不使用读写锁 package readwritelock;import java.util.HashMap; import java.util.Map;/*** author swaggyhang* create 2023-07-09 11:16*/ public class Test01 {public static void main(String[] args) {MyCache myCache new MyCache();for (…

功夫这个词,西方语言中没有

功夫这个词,西方语言中没有 功夫一种意思是武侠片的武功之意 另一种意思就是【下功夫】 趣讲大白话:只要功夫深,铁棒磨成针 【趣讲信息科技220期】 #非著名IT人安志强的趣味笔记# **************************** 西方词语怎么翻译功夫的&#…

EtherNet/IP转CAN网关can协议分为几种

生产管理设备中,会有设备与其他设备的协议不同,数据无法互通,让你的工作陷入困境。这时,一款神奇的产品出现了——远创智控YC-EIP-CAN通讯网关! 1, 这款通讯网关采用ETHERNET/IP从站功能,可以将各种CAN总…

什么事RPC并实现一个简单的RPC

1. 基本的RPC模型 主要介绍RPC是什么,基本的RPC代码,RPC与REST的区别,gRPC的使用 1.1 基本概念 RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务本地过程调用&am…

管理类联考——逻辑——技巧篇——数字编码——公式

🏠个人主页:fo安方的博客✨ 💂个人简历:大家好,我是fo安方,考取过HCIE Cloud Computing、CCIE Security、CISP、RHCE、CCNP RS、PEST 3等证书。🐳 💕兴趣爱好:b站天天刷&…

特斯拉12V低压系统存在问题:刹车失灵还能怪司机吗?

特斯拉汽车失控加速事件引发全球关注,美国NHTSA(交通运输安全委员会)和特斯拉之前将责任归咎于司机误操作。但一位研究人员提出新解释,并指出特斯拉的12V低压系统可能存在问题,特别是在高负载状态下。 此研究认为&…

git上传文件到Gitee报错“error: failed to push some refs to https://gitee.com/xxxx”

文章目录 前言一、创建项目仓库二、创建工作区三、配置 LFS四、上传镜像文件 前言 我要将一个 4.27 GB 的文件上传到 Gitee 上,但是出现了下面这样的报错 error: failed to push some refs to https://gitee.com/xxxx/centos.git 因此记录一下解决报错的方法。 一、…

基于粤嵌gec6818开发板嵌入式开发电子相册,音乐播放,视频播放,2048游戏

一、功能与要求 实现功能:本系统需要使用粤嵌的GEC-6818开发板设计一款娱乐影音系统,其中包括图片显示(相册)、音乐播放、视频播放,游戏四个部分,在每个部分内部,具有操控各个部分的功能触摸按…

UNIAPP调用讯飞语音评测API

1、历经千辛万苦,UNIAPP调用评测API终于完成,在此做下总结下:首先看效果! 2、实现第1步,首先是鉴权,用到的CryptoJS等工具都可以从讯飞和uniapp官方获取 import * as base64 from "base-64" impo…

redis操作问题

使用redisTemplate 往set集合中批量添加值 # 第一种办法就是for循环&#xff0c;每次进行setfor (int i 0; i < 1000000; i) {redisTemplate.opsForSet().add("key",i);} # 第二中办法就是使用HashSet批量添加数据Set set new HashSet<>();for (int i 1…

mybatisplus生成代码

导包&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>m…

CorelDRAW2023免费版平面设计矢量绘图工具

最初CorelDRAW 被开发运行于Windows版&#xff0c;数年后Macintosh版也随之发布。同时&#xff0c;CorelDRAW曾经存在过Linux的版本&#xff0c;但后来被放弃了。CorelDRAW简称cdr&#xff0c;是一款功能强大的矢量图制作软件&#xff0c;一说到矢量图制作&#xff0c;大家都会…

Go实现socks5服务器

SOCKS5 是一个代理协议&#xff0c;它在使用TCP/IP协议通讯的前端机器和服务器机器之间扮演一个中介角色&#xff0c;使得内部网中的前端机器变得能够访问Internet网中的服务器&#xff0c;或者使通讯更加安全。SOCKS5 服务器通过将前端发来的请求转发给真正的目标服务器&#…

应用层:万维网WWW

1.万维网WWW 笔记来源&#xff1a; 湖科大教书匠&#xff1a;应用层概述 湖科大教书匠&#xff1a;万维网WWW 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 浏览器最重要的部分是渲染引擎&#xff0c;也就是浏览器内核。负责对网页内容进行解析和…

【触类旁通】编写代码和写小说的相似性

【触类旁通】编写代码和写小说的相似性 1&#xff0c;序2&#xff0c;对比分析2.1 相同点2.1.1 三要素2.1.2 读者-用户&#xff08;受众&#xff09;2.1.3 目录——功能模块2.1.4 故事情节——框架2.1.5 文笔——编程风格2.1.6 多部作品——多个阶段2.1.7 修辞——设计模式2.1.…

Mycat【Mycat分片规则(取模、分片枚举、范围约定)】(六)-全面详解(学习总结---从入门到深化)

目录 Mycat分片规则_取模 Mycat分片规则_分片枚举 Mycat分片规则_范围约定 Mycat分片规则_取模 实现方式 取模分片就是根据数据表的某一个字段&#xff0c;通常是某一个整数型的字 段&#xff0c;对其进行十进制的求模运算&#xff0c;将运算结果作为Mycat的路由结果。 注…

Element-案例-脚本页面布局

案例需求&#xff1a; 根据页面原型完成员工管理页面开发&#xff0c;并通过Axios完成数据异步加载 步骤 创建页面&#xff0c;完成页面的总体布局规划布局中各个组件的实现列表数据的异步加载&#xff0c;并渲染展示 1.创建页面&#xff0c;完成页面的总体布局规划 分析案…

代码随想录算法训练营第十三天 | 二叉树系列4

二叉树系列4 617 合并二叉树重点代码随想录的代码我的代码(晚上理解后自己编写) 700 二叉搜索树中的搜索未看解答自己编写看了解答后&#xff0c;精简了两个判断的写法重点代码随想录的代码我的代码(晚上理解后自己编写) 98 验证二叉搜索树重点看到二叉搜索树&#xff0c;就要想…

rust 自动化测试、迭代器与闭包、智能指针、无畏并发

编写测试可以让我们的代码在后续迭代过程中不出现功能性缺陷问题&#xff1b;理解迭代器、闭包的函数式编程特性&#xff1b;Box<T>智能指针在堆上存储数据&#xff0c;Rc<T>智能指针开启多所有权模式等&#xff1b;理解并发&#xff0c;如何安全的使用线程&#x…

静态路由实验

目录 第一步&#xff1a; 第二步&#xff1a; 端口IP配置方法 环回接口IP配置方法 第三步&#xff1a; 第四步&#xff1a; 第一步&#xff1a; 先进行子网划分 192.168.1.0 24 子网划分 需要13个广播域 5个网段——子网划分 192.168.1.0 24 192.168.1.000 00000 27 192.…