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.hqwc.cn/news/522563.html

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

相关文章

JAVA虚拟机实战篇之内存调优[4](内存溢出问题案例)

文章目录 版权声明修复问题内存溢出问题分类 分页查询文章接口的内存溢出问题背景解决思路问题根源解决思路 Mybatis导致的内存溢出问题背景问题根源解决思路 导出大文件内存溢出问题背景问题根源解决思路 ThreadLocal占用大量内存问题背景问题根源解决思路 文章内容审核接口的…

消息队列-kafka-消息发送流程(源码跟踪) 与消息可靠性

官方网址 源码:https://kafka.apache.org/downloads 快速开始:https://kafka.apache.org/documentation/#gettingStarted springcloud整合 发送消息流程 主线程:主线程只负责组织消息,如果是同步发送会阻塞,如果是异…

力扣刷题Days13-101对称二叉树(js)

目录 1,题目 2,代码 2.1递归思想 2.2队列--迭代思想 3,学习与总结 1,题目 给你一个二叉树的根节点 root , 检查它是否轴对称。 2,代码 2.1递归思想 return dfs(left.left, right.right) && dfs(left.right, right.l…

Vue-Router路由介绍和使用

vue属于单页面应用,路由就是根据浏览器路径不同,用不同的试图组件替换这个页面内容 开启路由功能 如图在创建项目时候勾选rouler 这样创建好的项目就有路由功能 下一步 不同的访问路径 展示不同的页面内容 路由配置 路由连接组件 浏览器会解析为超链接 …

跨境电商趋势解析:社交电商携手私域流量运营,精准触达与转化

随着全球化的深入发展,跨境电商逐渐成为全球贸易的重要组成部分。在这一背景下,社交电商作为一种新兴的商业模式,正逐渐在跨境电商领域崭露头角,并对私域流量的运营产生了深远的影响。本文Nox聚星将和大家分析社交电商在跨境电商中…

CentOS7部署SonarQube 9.9.4 LTS

文章目录 下载地址前置条件安装sonarqube创建用户解压修改sonar.properties配置文件 启动sonarqube开启防火墙端口启动报错访问SonarQube安装汉化包 安装sonar-scanner 下载地址 社区稳定版本 版本依赖关系 Prerequisites and overview (sonarsource.com) 前置条件 JDK11安…

Java集合面试题(day 02)

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

鞋服品牌怎样合理把控订货深度和宽度

在鞋服品牌的运营管理中,订货深度和宽度是两个至关重要的概念。订货深度指的是某一款式或规格的产品数量,而订货宽度则代表品牌所涵盖的产品种类和款式。合理把控订货深度和宽度对于品牌的库存管理、销售情况以及顾客满意度都有着深远的影响。本文将探讨…

电脑小问题:Windows更新后黑屏

Windows 更新后黑屏解决方法 在 Windows 更新后,伴随了一个小问题,电脑启动后出现了桌面黑屏。原因可能是火绒把 explorer.exe 当病毒处理了。 下面讲解 Windows 更新后黑屏的解决方法,步骤如下: 1. 按 ctrl alt delete 组合键…

Linux centos 常用的网络负载和网速查看工具和命令

在 CentOS 上查看网络速度和网络负载,可以使用多种工具,以下是一些常用的命令行工具: iftop - 用于实时监视网络带宽使用情况。 安装命令: sudo yum install iftop 使用命令: sudo iftop nload - 一个简单的控制…

最新基于R语言lavaan结构方程模型(SEM)实践技术应用

基于R语言lavaan程序包,通过理论讲解和实际操作相结合的方式,由浅入深地系统介绍结构方程模型的建立、拟合、评估、筛选和结果展示的全过程。我们筛选大量经典案例,这些案例来自Nature、Ecology、Ecological Applications、Journal of Ecolog…

react-native使用react-native-reanimated报错

error信息: Error: [Reanimated] UpdatePropsManager is not available on non-native platform. 解决方案一: 简单粗暴不在浏览器里看打印,关闭debugger即可。 解决方案二: 找到这个ts文件然后注释掉相关代码 然后给这个包打上…