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

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

在这里插入图片描述
  我们知道在软件运行的过程中,总会出现各种各样的问题,各种各样的异常,而程序员的主要任务之一就是解决在程序运行过程中出现的这些异常。在很多程序员开发的代码中我们会看到在关键的地方为了保证程序能够有一个正常的反馈,大量地使用了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 "异常被全局捕获";}}

  自定义异常

相关文章:

  • Linux之实战命令19:tac应用实例(五十三)
  • 输入输出返回值
  • 深圳某局联想SR850服务器黄灯 不开机维修
  • gcc选项-fno-access-control 使用
  • JAVA-内部类和匿名内部类
  • 【微服务即时通讯系统】——etcd一致性键值存储系统、etcd的介绍、etcd的安装、etcd使用和功能测试
  • 【初阶数据结构】排序——选择排序
  • 使用lodash库实现防抖和节流
  • 进程的那些事--实现shell
  • 云计算中过等保三级需要的网络安全设备及详细讲解
  • 深度学习框架的选择:深入比较PyTorch与TensorFlow
  • Stable Diffusion ControlNet 的 control model(控制模型)
  • C语言 | Leetcode C语言题解之第442题数组中重复的数据
  • vue3 拖拽插件(drag)
  • UG NX二次开发(C#)-加工-创建加工坐标系,将刀位点和刀轴矢量变换到加工坐标系
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Gradle 5.0 正式版发布
  • Js基础——数据类型之Null和Undefined
  • Protobuf3语言指南
  • Sequelize 中文文档 v4 - Getting started - 入门
  • SQLServer插入数据
  • Vue组件定义
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 开发基于以太坊智能合约的DApp
  • 你不可错过的前端面试题(一)
  • 巧用 TypeScript (一)
  • 用Python写一份独特的元宵节祝福
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 中文输入法与React文本输入框的问题与解决方案
  • 1.Ext JS 建立web开发工程
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • #《AI中文版》V3 第 1 章 概述
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • $.ajax()
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (十一)手动添加用户和文件的特殊权限
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转载)从 Java 代码到 Java 堆
  • **PHP二维数组遍历时同时赋值
  • .form文件_一篇文章学会文件上传
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET/C# 使用反射注册事件
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .Net的DataSet直接与SQL2005交互
  • .NET中的Exception处理(C#)