Springboot教程(六)——异常处理

拦截异常

在Spring Boot中,我们可以将异常统一放在全局处理类来处理,创建一个全局异常处理类需要用到@ControllerAdvice和@ExceptionHandler注解。

@ControllerAdvice类似一个增强版的@Controller,用于标注类,表示该类声明了整个项目的全局资源

@ExceptionHandler类似catch语句,标注一个方法,用于处理异常。而这个方法可以有返回值,类似@Controller的返回值

@ExceptionHandler可以传入一个参数,为异常类的Class对象


接下来举个例子:

创建一个exception包,在这个包下面写入一个异常处理类:

package com.example.c0101.exceptionimport org.springframework.web.bind.annotation.ControllerAdvice
import org.springframework.web.bind.annotation.ExceptionHandler
import org.springframework.web.bind.annotation.ResponseBody@ControllerAdvice
class GlobalExceptionHandle {@ExceptionHandler(NullPointerException::class)@ResponseBodyfun handler(): String{return "参数不能为空"}}

这表示,当遇到空指针异常时,向前端发送消息“参数不能为空”

接下来创建一个controller包。在这个包下面写一个控制器类:

package com.example.c0101.controllerimport org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController@RestController
class TestController {@RequestMapping("/index")fun index(name: String): String{return "您的用户名是$name"}}

在/index的URI下,用户需要传入一个name参数,如果用户没有传入,则会触发空指针异常,调用我们之前写的异常处理类

我们使用postman测试一下:

可以看到,如果我们不传入name参数,则会调用异常处理类,并返回“参数不能为空” 


获取异常日志

我们可以使用slf4j打印异常日志:

log.error("参数为空", e)

这里面,log.error可以接受两个参数,第一个是提示字符串,第二个是异常对象


修改异常处理类如下:

package com.example.c0101.exceptionimport org.slf4j.LoggerFactory
import org.springframework.web.bind.annotation.ControllerAdvice
import org.springframework.web.bind.annotation.ExceptionHandler
import org.springframework.web.bind.annotation.ResponseBody@ControllerAdvice
class GlobalExceptionHandle {companion object{val log = LoggerFactory.getLogger(GlobalExceptionHandle::class.java)}@ExceptionHandler(NullPointerException::class)@ResponseBodyfun handler(e: NullPointerException): String{log.error("参数为空", e)return "参数不能为空"}}

这样我们就可以在出现异常时,打印异常日志了。用postman不传入参数,发现控制台输出:

说明我们成功的在日志中输出了错误信息 

修改异常状态下的响应码

我们可以通过@ResponseStatus注解设置响应码,如:

@ResponseStatus(HttpStatus.BAD_REQUEST)

修改异常处理类,使其能够在出现空指针异常时,返回400(Bad Request)状态码:

package com.example.c0101.exceptionimport org.slf4j.LoggerFactory
import org.springframework.http.HttpStatus
import org.springframework.web.bind.annotation.ControllerAdvice
import org.springframework.web.bind.annotation.ExceptionHandler
import org.springframework.web.bind.annotation.ResponseBody
import org.springframework.web.bind.annotation.ResponseStatus@ControllerAdvice
class GlobalExceptionHandle {companion object{val log = LoggerFactory.getLogger(GlobalExceptionHandle::class.java)}@ExceptionHandler(NullPointerException::class)@ResponseBody@ResponseStatus(HttpStatus.BAD_REQUEST)fun handler(e: NullPointerException): String{log.error("参数为空", e)return "参数不能为空"}}

用postman不加参数,测试一下:

可以看到,服务器最终返回了400状态码

只拦截某个包下发生的异常

我们可以通过@ControllerAdvice的默认属性或basePackages属性只拦截某个包下发生的异常:

@ControllerAdvice("com.example.c0101.controller")
@ControllerAdvice(basePackages = ["com.example.c0101.controller"])

只拦截被某个注解标注的类发生的异常

我们可以通过@ControllerAdvice的annotations属性只拦截某个注解标注的类发生的异常:

@ControllerAdvice(annotations = [RestController::class])

拦截自定义异常

我们可以在exception包下自定义异常,并使用拦截普通异常的方法拦截自定义异常:

package com.example.c0101.exceptionclass MyException(msg: String) : Exception(msg)

在异常处理类里设置要拦截的异常:

@ExceptionHandler(MyException::class)
@ResponseBody
fun handler(e: MyException): String{log.error("自定义异常", e)return "出现自定义异常"
}

这样就可以拦截自定义异常了

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

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

相关文章

嵌入式学习-FreeRTOS-Day3

嵌入式学习-FreeRTOS-Day3 一、思维导图 二、 1.FreeRTOS任务的调度算法及实现 默认是抢占式调度时间片轮询 1.抢占式调度:任务优先级高的可以打断任务优先级低的执行(适用于不同优先级) 2.时间片轮转:每一个任务拥有相同的时…

使用 Cypress 进行可视化回归测试:一种务实的方法

每次组件库 Picasso 发布新版本时,都会更新所有的前端应用程序,让绝大部分新功能能与整个平台的设计保持一致。上个月,推出了 Toptal Talent Portal 的 Picasso 更新,这是我们的用户用来找工作和与客户互动的平台。 已知了这个版本…

软考70-上午题-【面向对象技术2-UML】-UML中的图1

一、图的定义 图是一组元素的图形表示,大多数情况下把图画成顶点、弧的联通图。 顶点:代表事物; 弧:代表关系。 可以从不同的角度画图,UML提供了13种图:(只看9种) 类图&#xff…

数据结构实现

目录 一、线性表中顺序表的实现: 二、线性表的链式存储(链表-带头节点) 三、习题练习: 四、栈(stack) 五、循环队列 1.数组形式: 2.链表形式: 3.习题练习 六、二叉树 1.…

226. 翻转二叉树

代码实现: 方法1:先序遍历 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/// 交换左右子树 void swap(struct TreeNode *root) {struct TreeNode *l root…

Linux grep

文章目录 1. 基本用法2.字符转义3.二进制文件查找4.打印目标字段的附近行4. 多条件过滤5. 目录中过滤——用于在文件夹中筛选/排除指定后缀文件6.反向过滤——用于筛选7.只输出匹配内容——用于统计8. 筛选出包含字段的文件9.正则匹配10.管道和grep11.grep和wc/uniq/sort的合用…

B端系统优化,可不是换个颜色和图标,看看与大厂系统的差距。

Hi,我是贝格前端工场,优化升级各类管理系统的界面和体验,是我们核心业务之一,欢迎老铁们评论点赞互动,有需求可以私信我们 一、不要被流于表面的需求描述迷惑。 很多人找我们优化系统界面,对需求总是轻描淡…

小白跟做江科大51单片机之AD/DA

1.看原理图找接口 2.看时序图编写读取数据代码 XPT2046.c代码 #include <REGX52.H> //引脚定义 sbit XPY2046_DINP3^4; sbit XPY2046_CSP3^5; sbit XPY2046_DCLKP3^6; sbit XPY2046_DOUTP3^7; unsigned int XPT2046_ReadAD(unsigned char Command) { unsigned char …

sqllab 11-22

11.有回显&#xff0c;单引号 首先判断是字符型还是数字型 通过order by 来获取字段数 方便后续union联合 注意这里mime表明了内容要进行url编码&#xff0c;测试3报错&#xff0c;2正常&#xff0c;所以有2列。 还需要判断显示位&#xff0c;因为只有显示位的数据才能被爆出…

论文笔记:Efficient Bootstrapping for Confidential Transactions

EcoBoost: Efficient Bootstrapping for Confidential Transactions 设计了一种被称为EcoBoost的新方法&#xff0c;以提高支持机密交易的区块链的引导效率。具体来说&#xff0c;利用随机抽样来验证高概率保密交易的正确性。因此&#xff0c;与事务数量相比**&#xff0c;验证…

【FPGA】DDR3学习笔记(一)丨SDRAM原理详解

本篇文章包含的内容 一、DDR3简介1.1 DDR3 SDRAM概述1.2 SDRAM的基础结构 二、 SDRAM操作时序2.1 SDRAM操作指令2.2 模式寄存器&#xff08;LOAD MODE REGISTER&#xff09;2.3 SDRAM操作时序示例2.3.1 SDRAM初始化时序2.3.2 突发读时序2.3.3 随机读时序2.3.4 突发写时序2.3.5 …

Python学习笔记-Flask实现简单的抽奖程序(增加图片显示)

1.创建static文件夹,存放图片文件 2.hero列表数据更改为要抽奖的图片名 3.html中可以编写python语句,遍历hero列表内容渲染到表格中 4.在点击随机抽取后,可以获得名称,然后使用img标签,将获取的名称拼接到路径中 3.初始页面,访问127.0.0.1:5000/index 4.点击随机抽取后 5.py…

【深入理解设计模式】享元设计模式

享元设计模式 概述 享元设计模式&#xff08;Flyweight Design Pattern&#xff09;是一种用于性能优化的设计模式&#xff0c;它通过共享尽可能多的相似对象来减少对象的创建&#xff0c;从而降低内存使用和提高性能。享元模式的核心思想是将对象的共享部分提取出来&#xff…

实用干货:分享4个冷门但非常实用的HTML属性

大家好&#xff0c;我是大澈&#xff01; 本文约1100字&#xff0c;整篇阅读大约需要2分钟。 关注微信公众号&#xff1a;“程序员大澈”&#xff0c;免费加入问答群&#xff0c;一起交流技术难题与未来&#xff01; 现在关注公众号&#xff0c;免费送你 ”前后端入行大礼包…

TensorRT是什么,有什么作用,如何使用

TensorRT 是由 NVIDIA 提供的一个高性能深度学习推理&#xff08;inference&#xff09;引擎。它专为生产环境中的部署而设计&#xff0c;用于提高在 NVIDIA GPU 上运行的深度学习模型的推理速度和效率。以下是关于 TensorRT 的详细介绍&#xff1a; TensorRT 是 NVIDIA 推出的…

freeRTOS20240308

1.总结任务的调度算法&#xff0c;把实现代码再写一下 2.总结任务的状态以及是怎么样进行转换的

Java集合面试题(day 02)

&#x1f4d1;前言 本文主要是【JAVA】——Java集合面试题的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&am…

容器: string

引言: 为什么要有string类型, 就使用字符数组表示字符串不行吗? 原因: 使用字符数组描述文本信息, 无法确定开多大空间, 开多了浪费,开少了不够用使用string封装: 扩容机制:减少了空间的浪费各种接口:方便修改等操作 string的使用 容量相关 size:获取字符个数,不包含\0 (C语言…

从huggingface下载模型像本地加载但是UnicodeDecodeError

我自己是在Linux下出现了这个问题 原文&#xff1a;https://github.com/huggingface/transformers/issues/13674 The path for the AutoModel should be to a directory pointing to a pytorch_model.bin and to a config.json. Since you’re pointing to the .bin file dire…

无限debugger的几种处理方式

不少网站会在代码中加入‘debugger’&#xff0c;使你F12时一直卡在debugger&#xff0c;这种措施会让新手朋友束手无策。 js中创建debugger的方式有很多&#xff0c;基础的形式有&#xff1a; ①直接创建debugger debugger; ②通过eval创建debugger&#xff08;在虚拟机中…