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

Spring 面试题(一):Spring 如何处理全局异常?

在这里插入图片描述

❤️ 博客首页:水滴技术
🚀 支持水滴:点赞👍 + 收藏⭐ + 留言💬
🌸 订阅专栏:Spring 教程:从入门到精通

文章目录

  • 1、如何处理全局异常
  • 2、代码示例
    • 2.1、定义统一的“响应结果对象”
    • 2.2、定义“全局异常处理器”
    • 2.3、测试
  • 热门专栏


大家好,我是水滴~~

在开发中避免不了要做异常捕获,不可能在每段业务代码中进行捕获处理,那样代码也太冗余和复杂了。那么如何使用 Spring 处理全局异常呢?

1、如何处理全局异常

可以使用 @RestControllerAdvice@ExceptionHandler 注意进行处理:

  • @RestControllerAdvice:该注解加到自定义的“全局异常处理类”上,表示该类是对 Controller 的增强类,可以在该类中实现异常处理了。
  • @ExceptionHandler:该注解需要加到具体的“异常处理方法”上,使用该注解可以指定要处理的异常类型,并且“异常处理方法”要返回一个统一的“结果对象”。

@RestControllerAdvice 注解实际上就是 @ControllerAdvice + @ResponseBody,表示返回的处理结果对象为 JSON 类型。在前后端未分离项目中可以使用 @ControllerAdvice 注解,用于跳转到异常页面。

2、代码示例

2.1、定义统一的“响应结果对象”

在前后端分离项目中,我们通常会自定义一个统一的“响应结果对象”,为前端提供统一的响应结果。下面是一个简单的实现代码:

public class GlobalResult {/*** 状态码*/private int code;/*** 返回内容*/private String msg;/*** 返回数据*/private Object data;public GlobalResult(int code, String msg) {this.code = code;this.msg = msg;}public GlobalResult(Object data) {this.code = 200;this.msg = "成功";this.data = data;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}
}

2.2、定义“全局异常处理器”

创建一个 GlobalExceptionHandler 类,在该类上增加 @RestControllerAdvice 注解。自定义一些异常处理方法,使用 @ExceptionHandler 注解指定具体要处理的异常类型,也可以使用 Exception 类来处理所有异常,异常处理方法返回上面定义的“全局结果对象”。

import com.example.demo.restful.GlobalResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import javax.servlet.http.HttpServletRequest;@RestControllerAdvice
public class GlobalExceptionHandler {private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);/*** 系统异常处理** @param e* @param request* @return*/@ExceptionHandler(Exception.class)public GlobalResult handlerException(Exception e, HttpServletRequest request) {log.error("请求地址'{}',发生系统异常", request.getRequestURI(), e);return new GlobalResult(500, "系统异常");}/*** 算数异常** @param e* @param request* @return*/@ExceptionHandler(ArithmeticException.class)public GlobalResult handlerArithmeticException(ArithmeticException e, HttpServletRequest request) {log.error("请求地址'{}',发生计算异常", request.getRequestURI(), e);return new GlobalResult(500, "计算异常");}
}

2.3、测试

添加一个测试的 Controller 类,在 RESTFull 方法中故意制造一个异常,如下代码:

import com.example.demo.restful.GlobalResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test")
public class TestController {@GetMapping("/get")public GlobalResult get() {int i = 1/0;return new GlobalResult(200, "请求成功");}
}

当我们访问该请求时,可以看出返回的数据是我们自定义的异常,说明已经生效。如下图:
在这里插入图片描述


热门专栏

👍 《Python入门核心技术》
👍 《IDEA 教程:从入门到精通》
👍 《Java 教程:从入门到精通》
👍 《MySQL 教程:从入门到精通》
👍 《大数据核心技术从入门到精通》

在这里插入图片描述

相关文章:

Spring 面试题(一):Spring 如何处理全局异常?

❤️ 博客首页:水滴技术 🚀 支持水滴:点赞👍 收藏⭐ 留言💬 🌸 订阅专栏:Spring 教程:从入门到精通 文章目录1、如何处理全局异常2、代码示例2.1、定义统一的“响应结果对象”2.2、…...

Threadlocal为何引发内存泄漏问题

首先我们要先了解什么是泄漏问题和什么是内存溢出 内存泄漏表示程序员申请了内存,但是该内存一直无法被释放 内存溢出表示申请内存不足,就会报错 为何引发内存泄漏问题 因为每个线程都有自己独立的ThreadLocalMap对象,key为ThreadLocal&…...

如何写好 Python 的 Lambda 函数?

当你需要完成一件小工作时,在本地环境中使用这个函数,可以让工作如此得心应手,它就是 Lambda 函数。 Lambda 函数是 Python 中的匿名函数。有些人将它们简称为lambdas,它们的语法如下: lambda arguments: expression…...

大数据技术架构(组件)32——Spark:Spark SQL--Execute Engine

2.2、Spark SQL2.2.1、Execute EngineSparkSql的整体提交执行流程和Hive的执行流程基本上一致。站在通用的角度,对于SparkSql来说,从Sql到Spark的RDD执行需要经历两个大的阶段:逻辑计划和物理计划逻辑计划层面会把用户提交的sql转换成树型结构…...

Leetcode.1138 字母板上的路径

题目链接 Leetcode.1138 字母板上的路径 Rating : 1411 题目描述 我们从一块字母板上的位置 (0, 0)出发,该坐标对应的字符为 board[0][0]。 在本题里,字母板为board ["abcde", "fghij", "klmno", "pqr…...

一个自动配置 opengrok 多项目的脚本

前段时间在服务器上配置 opengrok 阅读代码,项目有很多个,一个一个手动配置比较繁琐。 我从搭建 tomcat 和 opengrok,到配置和索引完 5 个 Android 项目,用了差不多一整天。 要是再让我手动配置几个项目,估计真要崩溃…...

JAVA同步代码块 同步方法

JAVA同步代码块 & 同步方法 为了解决多线程操作共享数据时产生的安全问题 例如以下代码 if (ticket < 0) {// 卖完了break; } else {ticket--;System.out.println(Thread.currentThread().getName() "在卖票&#xff0c;还剩下" ticket "张")…...

分享111个助理类简历模板,总有一款适合您

分享111个助理类简历模板&#xff0c;总有一款适合您 111个助理类简历模板下载链接&#xff1a;https://pan.baidu.com/s/1JafYuLPQMmq37K4V0wiqWA?pwd8y54 提取码&#xff1a;8y54 Python采集代码下载链接&#xff1a;https://wwgn.lanzoul.com/iKGwb0kye3wj 设计师助理…...

Allegro如何更改临时高亮的颜色设置操作指导

Allegro如何更改临时高亮的颜色设置操作指导 在用Allegro做PCB设计的时候,当移动或者高亮某个对象之前,会被临时高亮一个颜色,方便查看,类似下图 运行高亮命令的时候,器件被临时高亮成了白色 软件默认的是白色,如何更改成其它颜色? 具体操作如下 点击Display选择Color…...

知识图谱嵌入技术研究综述

作者 张天成 1 , * 田 雪 1 , * 孙相会 1 , * 于明鹤 2 , * 孙艳红 1 , * 于 戈 摘要 知识图谱 是一种用图模型来描述知识和建模事物之间的关联关系的技术。 知识图谱嵌入 作为一种被广泛采用的知识表示方法。 主要思想是将知识图谱中的实体和关系嵌入到连续的向量空间中…...

Scratch少儿编程案例-水果忍者-超完整

专栏分享 点击跳转=>Unity3D特效百例点击跳转=>案例项目实战源码点击跳转=>游戏脚本-辅助自动化点击跳转=>Android控件全解手册点击跳转=>Scratch编程案例👉关于作者...

练 习

1.判断三个中最重的//依次输入相应的人的体重double people1, people2, people3;cout << "请输入第一个人体重" << endl;cin >> people1;cout << "请输入第二个人体重" << endl;cin >> people2;cout << "请…...

Urho3D整体结构

Urho3D引擎编译成一个库。从概念上讲&#xff0c;它由几个代表不同子系统或功能的“子库”组成。其中每个都位于Source/Urho3D目录下的子目录中&#xff1a; 容器:提供STL替换类和共享指针。数学:提供相交测试中使用的矢量、四元数和矩阵类型以及几何形状。Core:提供执行上下文…...

大数据技术之Hudi

Hudi概述 1.1 Hudi简介 Apache Hudi&#xff08;Hadoop Upserts Delete and Incremental&#xff09;是下一代流数据湖平台。Apache Hudi将核心仓库和数据库功能直接引入数据湖。Hudi提供了表、事务、高效的upserts/delete、高级索引、流摄取服务、数据集群/压缩优化和并发&a…...

libxlsxwriter条件格式

今天来看一个libxlsxwriter的高级用法&#xff1a;一个条件格式的示例。 说它“高级”&#xff0c;也是基于非Excel专家的小白们的视角。对&#xff0c;没错&#xff0c;本小白正是这样的小白。 1 一个简单的问题 来看我们今天的场景问题&#xff1a;有一列数据&#xff0c;有…...

nodejs+vue+elementui在线求助系统vscode

目 录 摘 要 1 前 言 3 第1章 概述 4 1.1 研究背景 4 1.2 研究目的 4 1.3 研究内容 4 第二章 开发技术介绍 5 前端技术&#xff1a;nodejsvueelementui,视图层其实质就是vue页面&#xff0c;通过编写vue页面从而展示在浏览器中&#xff0c;编写完成的vue页面要能够和控制器类进…...

电子技术——BJT差分输入对

电子技术——BJT差分输入对 本节我们来讨论BJT差分输入对。 共模输入 下图是BJT差分输入对的基本原理图&#xff1a; 首先我们考虑两端输入共模信号 VCMV_{CM}VCM​ &#xff1a; 此时 vB1vB2VCMv_{B1} v_{B2} V_{CM}vB1​vB2​VCM​ 因为电路的对称结构&#xff0c;所以 i…...

[MySQL教程②] - MySQL介绍和发展史

目录 ❤ MySQL介绍 ❤ 什么是数据库 ❤ 什么是数据 ❤ 数据库管理系统 ❤ NoSQL特性总览 ❤ NoSQL的分类、特点、典型产品 ❤ 常见的数据库产品有哪些&#xff1f; ❤ Oracle公司产品介绍 Oracle数据库版本介绍 Oracle的市场应用 MySQL数据库版本介绍 MyS…...

多表查询--实例

1 创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) ); 创建score表。SQL代码如下&#xff1a; CREATE TABLE score ( id INT…...

Differentially Private Grids for Geospatial Data

文章目录abstractintroabstract 在本文中&#xff0c;我们解决了为二维数据集(如地理空间数据集)构建差异私有概要的问题。目前最先进的方法通过执行数据域的递归二进制分区和构造分区的层次结构来工作。我们表明&#xff0c;基于分区的概要方法的关键挑战在于选择正确的分区粒…...

Java学习记录day8

类与对象 继承例题 https://www.bilibili.com/video/BV1PU4y1E7nX?p55&vd_source8f80327daa664c039f5c342a25bcbbae&#xff08;B站千峰马剑威Java基础入门视频第P55&#xff0c;记录的重要学习内容之一&#xff09; final关键字 作用&#xff1a; 声明一个常量&…...

Solon2 开发之容器,三、注入或手动获取 Bean

1、如何注入Bean&#xff1f; 先了解一下Bean生命周期的简化版&#xff1a; 运行构建函数尝试字段注入&#xff08;有时同步注入&#xff0c;没时订阅注入。不会有相互依赖而卡住的问题&#xff09;Init 函数&#xff08;是在容器初始化完成后才执行&#xff09;…释放&#…...

微信小程序_调用openAi搭建虚拟伙伴聊天

微信小程序_调用openAi搭建虚拟伙伴聊天背景效果关于账号注册接口实现8行python搞定小程序实现页面结构数据逻辑结速背景 从2022年的年底&#xff0c;网上都是chagpt的传说&#xff0c;个人理解这个chatgpt是模型优化训练&#xff0c;我们在用chatgpt的时候就在优化这个模型&a…...

硬件工程师入门基础知识(一)基础元器件认识(一)

硬件工程师入门基础知识 &#xff08;一&#xff09;基础元器件认识&#xff08;一&#xff09; 今天水一篇hhh。介绍点基础但是实用的东西。 tips&#xff1a;学习资料和数据来自《硬件工程师炼成之路》、百度百科、网上资料。 1.贴片电阻 2.电容 3.电感 4.磁珠 1.贴片电…...

TCP的运输连接管理

TCP的运输连接管理 文章目录TCP的运输连接管理TCP报文格式简介首部各个字段的含义控制位(flags)TCP的连接建立抓包验证一些细节及解答TCP连接释放抓包验证一些细节及解答参考TCP是面向连接的协议。运输连接是用来传送TCP报文的。TCP运输连接的建立和释放时每一次面向连接的通信…...

地级市用电、用水、用气数据指标

用电用水量和煤气及液化石油气供应及利用情况可以反映出城市基础设施的建设情况&#xff01;之前我们基于历年的《中国城市统计年鉴》整理了1999—2020年的人口数量数据指标、人口变动数据指标、用地相关数据指标、污染物排放和环境治理相关数据指标、地区生产总值及一二三产构…...

安装deepinlinuxV20.8配置docker和vscode开发c语言

# 重装的原因 某个开发任务时&#xff0c;发现需要glibc2.25,本机版本比较低&#xff0c;就下载源码configure make makeinstall&#xff0c;结果失败了&#xff0c; 看来与系统用的glibc有冲突&#xff0c;造成部分库版本不一致&#xff0c;打开终端出现段错误&#x…...

java08-面向对象3

一&#xff1a;static 关键字&#xff1a;静态的 1.可以用来修饰的结构:主要用来修饰类的内部结构 属性、方法、代码块、内部类 2. static 修饰属性&#xff1a;静态变量&#xff08;或类变量&#xff09; 2.1 属性&#xff0c;是否使用static修饰&#xff0c;又分为静态属…...

【Spark分布式内存计算框架——Spark Core】8. 共享变量

第七章 共享变量 在默认情况下&#xff0c;当Spark在集群的多个不同节点的多个任务上并行运行一个函数时&#xff0c;它会把函数中涉及到的每个变量&#xff0c;在每个任务上都生成一个副本。但是&#xff0c;有时候需要在多个任务之间共享变量&#xff0c;或者在任务(Task)和…...

C++多态常见面试题

1.什么是多态 简单点说&#xff0c;就是多种形态&#xff0c;具体就是完成某个行为&#xff0c;当不同的对象去完成时产生的不同形态。多态分为静态多态和动态多态&#xff0c;静态多态一般指的是函数重载&#xff0c;在编译阶段通过函数名修饰规则&#xff0c;不同类型调用不同…...

网站备案工信部/app投放推广

新西兰程序员 ASP.NET网站中设置404自定义错误页面 在用ASP.NET WebForm开发一个网站时&#xff0c;需要自定义404错误页面. 做法是这样的 在网站根目录下建立了一个404.html的错误页面&#xff0c;然后在Global.asax文件中&#xff0c;加入如下代码&#xff1a; <% Applica…...

本地江苏网站建设/24小时自助下单平台网站便宜

更新&#xff08;Update&#xff09; 在ThinkPHP中使用save方法更新数据库&#xff0c;并且也支持连贯操作的使用。 save 更新数据到数据库用法 save($data,$optionsarray())参数 data&#xff1a;要保存的数据&#xff0c;如果为空&#xff0c;则取当前的数据对象。 option…...

263邮箱个人登录入口/长沙seo男团

前言 由浅入深、逐个击破 30SecondsOfCode 中函数系列所有源码片段&#xff0c;带你领略源码之美。 本系列是对名库 30SecondsOfCode 的深入刨析。 本篇是其中的函数篇&#xff0c;可以在极短的时间内培养你的函数式思维。 内容根据源码的难易等级进行排版&#xff0c;目录…...

天津市建设 中标公示网站/seo费用

1.输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。 思路&#xff1a;这个题麻烦在&…...

新网站怎么做网络推广/全球搜效果怎么样

虽然opencv3是基于opencv2进行开发的&#xff08;一部分opencv2代码在opencv3中还能正常运行&#xff09;&#xff0c;但opencv3自身也做了部分修改&#xff0c;而目前网上很多教程还是基于opencv2的函数API来编写的&#xff0c;这导致在使用opencv3时会遇到各种函数未定义之类…...

然后做网站/搜索引擎优化专员

https://blog.csdn.net/weixin_41796631/article/details/83051966 父组件&#xff1a; 子组件...