首页 > 其他分享 >Spring Boot 进阶-Spring Boot的全局异常处理机制详解

Spring Boot 进阶-Spring Boot的全局异常处理机制详解

时间:2024-09-29 08:51:41浏览次数:8  
标签:进阶 处理 Spring Boot ExceptionHandler 注解 全局 异常

在这里插入图片描述
  我们知道在软件运行的过程中,总会出现各种各样的问题,各种各样的异常,而程序员的主要任务之一就是解决在程序运行过程中出现的这些异常。在很多程序员开发的代码中我们会看到在关键的地方为了保证程序能够有一个正常的反馈,大量地使用了try catch finally语句。

  大量的try catch语句不但增加了代码的冗余,而且还降低了代码的可读性。所以在Spring Boot 中就有人想将这些try catch的异常处理通过全局的方式进行处理,也就是说在我们正常的开发中就不需要再去关心这些异常的处理了。我们只需要在一个地方进行统一的配置就可以完成全局异常的处理了。

全局异常处理介绍

  其实在Spring 3.x的版本中就已经有全局异常处理的注解被提出使用了。例如@ControllerAdvice、@ExceptionHandler、@InitBinder、@ModelAttribute 等等注解。

  而这些注解从字面上来看与异常有关的就只有一个@ExceptionHandler 注解,也就是异常处理器的关键注解。其实在Spring中的异常处理机制有两种,一种是全局异常处理、一种是局部异常处理。那么什么是全局异常处理?什么是局部异常处理?

  首先局部异常处理顾名思义就是在某些方法或者某些类上对该类中存在的异常进行处理,主要使用的注解就是@ExceptionHandler和@Controller两个注解。这里需要注意的是只有指定了@Controller的类才会被@ExceptionHandler注解所捕获到对应的异常,在实际开发过程中,Controller是不可控的,所以说,这个方式显然不适合在大批量的Controller中使用。那么这就需要用到我们的全局异常处理机制了

  全局异常处理机制,首先来讲它可以完成的异常处理在数量上远比局部异常处理要多,其次就是它需要建立一种与局部异常处理机制不同的异常处理全局捕获的方式。所以就出现了@ControllerAdvice注解,,这个注解搭配上@ExceptionHandler 就可以彻底解决全局异常处理的问题。当然后续还出现了@RestControllerAdvice注解,其实这个注解与@ControllerAdvice注解的区别与联系就如同前面提到过的@Controller注解与@RestController注解是类似的,都是Response的返回值进行了序列化的处理。

Spring Boot中的异常分类

  我们知道其实异常处理是Java语言本身的特性,所以Java语言本身就会有很多的异常,更不用说是在SpringBoot中存在的异常了,也是非常多的。

  这里我们根据Spring Boot中的业务场景不同来对异常进行分类。一种就是进入业务之前的异常,一种就是在业务逻辑中的异常。如图所示,图片来源网络。
在这里插入图片描述
  在进入业务逻辑之前的异常一般是由Servlet操作引起的,一般需要处理的异常有如下一些

  • NoHandlerFoundException:表示客户端的请求在服务端没有找到对应的处理器,这个异常会抛出404的错误。
  • HttpRequestMethodNotSupportedException:从异常描述可以知道,它表示在使用HTTP请求的时候请求方法不支持,也就是说原本该使用GET请求的方法,使用了POST请求方法,这个异常会抛出405的错误
  • HttpMediaTypeNotSupportedException:这个异常表示客户端请求的媒体类型错误,也就是说原本需要使用JSON数据请求的却用的是x-form-data的数据进行请求。一般会抛出415的异常
  • MissingPathVariableException:表示路径参数未找到,一般就是参数传输错误,引起的错误就是400的错误。

  而进入业务逻辑之后的异常则是有代码内部引起的一般常见的错误就是空指针异常。这个需要根据具体的业务逻辑以及对应的业务场景进行处理。

在Spring Boot中如何对这些异常进行统一处理呢?

  在异常处理的时候一般开发人员关注的就是什么地方的异常,出现异常的原因是什么?在我们统一处理的时候需要注意哪些问题?下面我们就带着这些问题一一来解答。
  统一异常处理的步骤很简单,我们还是以前面创建的项目来做演示

  • 第一步、需要创建一个全局异常处理的处理类
  • 第二步、在这个类上标注@RestControllerAdvice注解,或者使用@ControllerAdvice 和@ResponseBody组合来实现
  • 第三步、方法上标注上对应的异常处理的注解@ExceptionHandler,并且指定需要捕获的异常是什么,也可以指定多个。

  根据以上的步骤我们来创建对应的处理代码。

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
   

    @ExceptionHandler(TestException.class)
    public String testExceptionHandler(TestException testException){
   
        log.info("全局异常处理",testException.getMessage());
        return "异常被全局捕获";
    }

}

  自定义异常

标签:进阶,处理,Spring,Boot,ExceptionHandler,注解,全局,异常
From: https://blog.csdn.net/nihui123/article/details/142626443

相关文章

  • SpringBoot-MybatisPlus项目中,在控制台查看sql执行日志的方法
    SpringBoot-MybatisPlus项目中,在控制台查看sql执行日志的方法springboot、maven、mybatisplus、sql、日志、控制台、console、log背景在baomidou.com学习mybatisPlus入门的过程中,接触到表名和关键词冲突,加注解加表名引号后问题解决。不过我还想,在控制台打印一下执行......
  • Springboot综合练习
        Springboot综合练习,使用三层架构,结合Mybatis操作数据库,接收前端发送的请求,并进行对应的逻辑处理,对数据库增删改查。    pojoDeptpackagecom.wzb.pojo;importlombok.AllArgsConstructor;importlombok.Data;importlombok.NoArgsConstructor;impo......
  • Spring 的循环依赖
    在Spring中,循环依赖是指两个或多个Bean相互依赖,导致在创建过程中出现了依赖死锁的问题。为了解决循环依赖,Spring引入了三级缓存机制。了解为什么需要三级缓存机制,首先要明白循环依赖是如何发生的,以及两级缓存为什么不足够。一、循环依赖是什么?假设有两个BeanA和B:A......
  • PbootCms导航菜单标签的这些小技巧你都知道吗?
    为了帮助新手更好地理解和使用PbootCMS模板中的标签,以下是一些常见问题及其解决方案。1.常用的导航标签<spanstyle="font-size:14px;">{pboot:nav}<ahref="[nav:link]">[nav:name]</a>{/pboot:nav}</span>控制参数*num=数量:非必填,用于控制输出的数量。*parent=......
  • PbootCMS后台访问地址及默认帐号密码
    如果你在使用PbootCMS时遇到关于后台默认账号密码的问题,以下是一些关键信息:PbootCMS后台默认访问路径访问路径:你的域名/admin.php将“你的域名”替换为实际的网址。后台初始账号密码初始账号:admin初始密码:admin示例假设你的域名为 example.com,则后台访问路径为:......
  • pbootcms后台“登录失败:表单提交校验失败,请刷新后重试”
    今天遇到一个客户无法登录PbootCMS模板的后台,提示如下:“登录失败:表单提交校验失败,请刷新后重试”客户表示没有修改过任何文件,并且昨天还能正常登录,今天突然出现了这个问题。经过排查,最终通过重启服务器解决了问题。问题描述错误提示:登录失败,表单提交校验失败,请刷新后重......
  • pbootcms统计代码标签(如何安装百度统计代码)
    要在PbootCMS中安装百度统计代码或其他第三方统计代码,可以按照以下步骤操作:1.后台安装统计代码登录后台:访问后台地址:你的域名/admin.php。账号:admin,密码:admin。进入站点信息设置:在后台左侧菜单中选择“基础内容”->“站点信息”。粘贴统计代码:在“站点信......
  • pbootcms如何实现留言内容自动发送到QQ邮箱
    要在PbootCMS中实现留言内容自动发送到QQ邮箱,需要完成以下几个步骤:准备两个QQ邮箱配置发件邮箱的SMTP服务在PbootCMS后台设置邮件发送1.准备两个QQ邮箱发件邮箱:用于发送邮件的邮箱。收件邮箱:用于接收留言内容的邮箱。2.配置发件邮箱的SMTP服务登录QQ邮箱登录发......
  • pbootcms网站常见报错(错误提示)集合
    为了帮助PbootCMS的站长们快速解决在后台或前台出现的常见问题,以下是针对特定错误提示的解决方法汇总:1.后台图片上传提示:“上传失败:存储目录创建失败!”解决方法:给静态资源目录(位于根目录下的static文件夹)增加权限。推荐设置权限为755,也可以设置为777,但请注意777权限较高,可......
  • pbootcms怎么获取当前日期、显示星期几
    在PHP中,可以使用date函数来获取当前日期和星期几。以下是详细的示例代码:1.获取当前日期php echodate("Y-m-d");//输出:2023-03-302.获取当前星期几2.1英文星期几php echodate("l");//输出:Thursday2.2数字星期几php echodate("w");//输出:3(......