2023.12.4 关于 Spring Boot 统一异常处理

news2024/11/29 2:46:41

目录

引言

统一异常处理

异常全部监测


引言

  • 将异常处理逻辑集中到一个地方,可以避免在每个控制器或业务逻辑中都编写相似的异常处理代码,这降低了代码的冗余,提高了代码的可维护性
  • 统一的异常处理使得调试和维护变得更加容易,通过集中处理异常,开发人员可以更轻松地定位和解决应用程序中的问题,而不必在整个代码库中查找异常处理逻辑
  • 自定义异常处理器能够提供更友好、可读性更强的错误信息,使用户更容易理解问题的本质,这对于客户端开发人员和最终用户都是有益的

统一异常处理

  • 在程序运行时,难免会产生一些异常错误
  • 当后端发生异常时,前端将无法正确获取到数据

实例理解

  • 此处我们创建一个 UserController 类,并编写一个存在空指针异常的 test 方法
package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/test")
    public int test() {
        Object obj = null;
        obj.hashCode();
        return 1;
    }
}
  • 在浏览器中输入对应的 URL,来访问调用 UserController 类中的 test 方法

  • 我们发现浏览器直接显示 500,表示服务器错误
  • 此时前端是无法对该页面进行处理的
  • 因此无论是否出现异常,后端都应该给前端返回约定格式的数据,这时候统一的异常处理就非常有必要了
package com.example.demo.component;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;

@ControllerAdvice
@ResponseBody
public class MyExceptionAdvice {

    @ExceptionHandler(NullPointerException.class)
    public HashMap<String,Object> doNullPointerException(NullPointerException e) {
//        自定义异常处理
        HashMap<String,Object> result = new HashMap<>();
        result.put("code",-1);
        result.put("msg","异常类型:" + e);
        result.put("data",null);
        return result;
    }
}
  • @ControllerAdvice 注解用于定义全局控制器通知,它允许将全局性的处理逻辑应用于整个应用程序中的多个控制器
  • @ExceptionHandler 注解用于处理整个应用程序中发生的异常,即 当任何控制器抛出异常时,可以在这里定义统一的处理逻辑,而不需要在每个控制器中单独处理

  • 通过对空指针异常的统一处理
  • 我们实现了当 控制器 出现空指针异常时,后端将会返回一个包含错误信息的 JSON 对象,该对象包含 错误码、错误信息、数据
  • 该JSON 对象有助于前端对其进行相应的处理

异常全部监测

  • 在生产环境中,我们可能会无意识的写出一些错误代码而导致各种出现异常,这是很难预料到的
  • 如 算数异常、数组越界异常、类型转换异常 等
  • 但是我们有必要针对每一个异常都写一个单独的处理方法吗?如上文对 空指针异常 处理的 doNullPointerException 一样
  • 这显然是没必要的
  • 因为 我们可以对所有异常进行统一处理,对个别有要求的异常进行特殊处理

实例理解

  • 此处我们创建一个 UserController 类,并编写一个存在 数组越界异常的 arr 方法
package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/arr")
    public int arr() {
        int[] array = new int[3];
        for (int i = 0; i < 4; i++) {
            array[i] = i;
        }
        return 1;
    }
}
  • 此处我们直接对 Exception 进行异常统一处理
  • Exception 是所有异常的父类
package com.example.demo.component;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;

@ControllerAdvice
@ResponseBody
public class MyExceptionAdvice {

    @ExceptionHandler(Exception.class)
    public HashMap<String,Object> doException(Exception e) {
//        自定义异常处理
        HashMap<String,Object> result = new HashMap<>();
        result.put("code",-2);
        result.put("msg","异常类型:" + e);
        result.put("data",null);
        return result;
    }
}
  • 在浏览器中输入对应的 URL,来访问调用 UserController 类中的 arr 方法

  • 成功返回了一个包含错误信息的 JSON 对象,且异常类型为 数组越界异常

实例理解二

  • 此处我们对 Exception ,即所有异常的父类 进行了异常统一处理
  • 此外我们还单独对 NullPointException ,即空指针异常 进行了异常统一处理
package com.example.demo.component;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;

@ControllerAdvice
@ResponseBody
public class MyExceptionAdvice {

    @ExceptionHandler(Exception.class)
    public HashMap<String,Object> doException(Exception e) {
//        自定义异常处理
        HashMap<String,Object> result = new HashMap<>();
        result.put("code",-2);
        result.put("msg","异常类型:" + e);
        result.put("data",null);
        return result;
    }

//    对 空指针异常进行特殊处理
    @ExceptionHandler(NullPointerException.class)
    public HashMap<String,Object> doNullPointerException(NullPointerException e) {
//        自定义异常处理
        HashMap<String,Object> result = new HashMap<>();
        result.put("code",-1);
        result.put("msg","异常类型:" + e);
        result.put("data",null);
        return result;
    }
}
  • 此时在浏览器中输入对应的 URL 对上文存在空指针异常的 test 方法进行访问调用

  • 由上图可知,当 父类和子类异常 同时存在的情况下,优先子类自己的异常处理
  • 从而可以实现 对所有异常进行统一处理,对个别有要求的异常进行单独的特殊处理

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

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

相关文章

deepflow本地部署过程

本地服务器配置&#xff0c;32C&#xff0c;48G内存 整个过程需要配置k8s&#xff0c;安装helm, 安装grafana, 安装deepflow以及deepflow-ctl&#xff0c;以及部署demo 在采用sealos进行ALL-IN-ONE部署之前&#xff0c; grafana 先安装它 wget -q -O /usr/share/keyrings/gr…

VSCode + gdb + gdbserver调试ARM程序

在开发ARM嵌入式端C/C程序时&#xff0c;一般会在PC上编写代码&#xff0c;在Linux服务器上编译&#xff0c;然后将程序复制或挂载到ARM开发板上运行。如果程序出了问题&#xff0c;在不使用gdb的情况下&#xff0c;经常在代码中添加打印&#xff0c;编译&#xff0c;然后在开发…

nodejs+vue+ElementUi小区社区公寓宿舍智能访客预约系统

该系统将采用B/S结构模式&#xff0c;前端部分主要使用html、css、JavaScript等技术&#xff0c;使用Vue和ElementUI框架搭建前端页面&#xff0c;后端部分将使用Nodejs来搭建服务器&#xff0c;并使用MySQL建立后台数据系统&#xff0c;通过axios完成前后端的交互&#xff0c;…

内网渗透Dump Hash之NTDS.dit

Ntds.dit 在活动⽬录中&#xff0c;所有的数据都保存在域控的ntds.dit⽂件中。 ntds.dit是⼀ 个⼆进制⽂件&#xff0c;⽂件路径为域控的%SystemRoot%\ntds\ntds.dit。NTDS.dit 包 含不限于⽤户名、散列值、组、GPP、OU等活动⽬录的信息。系统运维⼈员可以使⽤VSS实 现对该⽂件…

金蝶云星空单据编辑界面,不允许批量填充操作【分条件】

文章目录 金蝶云星空单据编辑界面&#xff0c;不允许批量填充操作【分条件】前提说明案例演示开发设计测试填充值清空值 金蝶云星空单据编辑界面&#xff0c;不允许批量填充操作【分条件】 前提说明 上一个文章的设计&#xff0c;不管是填充值&#xff0c;还是清空值都一律不…

【matlab程序】matlab画螺旋图|旋转图

%% 数学之美====》螺旋线 % 海洋与大气科学 % 20231205 clear;clc;close all; n=10; t=0:0.01:2pin; R=1; xx=nan(length(t),1);yy=nan(length(t),1); for i=1:length(t) xx(i)=Rcos(t(i)); yy(i)=Rsin(t(i)); R=R+1; end figure set(gcf,‘position’,[50 50 1200 1200],‘col…

基于PIPNet的人脸106关键点检测

做美颜需要使用到人脸关键点&#xff0c;所以整理了一下最近的想法。 按模型结构分类&#xff1a; 1.Top-Down: 分为两个步骤&#xff0c;首先&#xff0c;对于原始输入图片做目标检测&#xff0c;比如做人脸检测&#xff0c;将人脸区域抠出&#xff0c;单独送进关键点检测模…

sql-SQL练习生

推荐一款inscode内的模板SQL练习生&#xff0c;此文附带目前所有题的答案 如有错误欢迎斧正~ https://inscode.csdn.net/TPEngineer/SQLBoy 为了更好的体验&#xff0c;请按下面的方法打开&#xff1a; 1.运行一下 2.等待加载 3.在网页打开 温馨提醒&#xff1a;此处做题不会保…

【交叉编译】

一、什么是交叉编译 二、为什么要交叉编译&#xff1f; 三、交叉编译要用到的工具&#xff08;工具链、交叉编译器&#xff09; 四、交叉编译工具链的安装 五、配置环境变量 六、交叉编译工具编译 七、带wiringPi库的交叉编译如何进行 八、软链接、硬链接 九、Linux创建链接命令…

nodejs+vue+ElementUi牙科诊所信息化系统

该系统将采用B/S结构模式&#xff0c;前端部分主要使用html、css、JavaScript等技术&#xff0c;使用Vue和ElementUI框架搭建前端页面&#xff0c;后端部分将使用Nodejs来搭建服务器&#xff0c;并使用MySQL建立后台数据系统&#xff0c;通过axios完成前后端的交互&#xff0c;…

认识异常 ---java

目录 一. 异常的概念 二. 异常的体系结构 三. 异常的分类 三. 异常的处理 3.1 异常的抛出throw 3.2. 异常声明throws 3.3 捕获并处理try-catch finally 3.4异常的处理流程 四. 自定义异常类 一. 异常的概念 在 Java 中&#xff0c;将程序执行过程中发生的不正常行为称为…

CPP-SCNUOJ-Problem P24. [算法课贪心] 跳跃游戏

Problem P24. [算法课贪心] 跳跃游戏 给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个下标。 输入 输入一行数组nums 输出 输出true/fasle 样例 标准输入 2 3 1 …

出海风潮:中国母婴品牌征服国际市场的机遇与挑战!

近年来&#xff0c;中国母婴品牌在国内市场蓬勃发展的同时&#xff0c;也逐渐将目光投向国际市场。这一趋势不仅受益于中国经济的崛起&#xff0c;还得益于全球市场对高质量母婴产品的不断需求。然而&#xff0c;面对国际市场的机遇&#xff0c;中国母婴品牌同样面临着一系列挑…

Myblog02-基于ssm,springboot的改进

目录 一、项目概述&#xff1a; 应用技术&#xff1a; 接口实现&#xff1a; 数据库建表&#xff0c;sql脚本&#xff1a; 页面展示&#xff1a;登陆页面 项目源码&#xff1a;myblog01: 初版的个人博客项目-使用基本的javaWeb (gitee.com) 二、对博客系统进行测试 总结…

深入分析爬虫中time.sleep和Request的并发影响

背景介绍 在编写Python爬虫程序时&#xff0c;我们经常会遇到需要控制爬取速度以及处理并发请求的情况。本文将深入探讨Python爬虫中使用time.sleep()和请求对象时可能出现的并发影响&#xff0c;并提供解决方案。 time.sleep()介绍 首先&#xff0c;让我们来了解一下time.s…

【发布小程序配置服务器域名,不配置发布之后访问就会报错request:fail url not in domain list】

小程序在本地开发的时候大家通常会在微信开发者工具中设置“不校验合法域名、web-view (业务域名)、TLS 版本以及HTTPS证书”&#xff0c;久而久之可能会忘掉这个操作&#xff0c;然后打包直接上线发布&#xff0c;结果发现访问会报错request:fail url not in domain list&…

CETN03 - The Evolution of Computers

文章目录 I. IntroductionII. First Modern Digital Computer: ENIAC (1946)III. First Generation ComputerIV. Second Generation ComputerV. Third Generation ComputerVI. Fourth Generation ComputerVII. ConclusionI. 引言II. 第一台现代数字计算机&#xff1a;ENIAC&…

自定义 el-select 和 el-input 样式

文章目录 需求分析el-select 样式el-input 样式el-table 样式 需求 自定义 选择框的下拉框的样式和输入框 分析 el-select 样式 .select_box{// 默认placeholder:deep .el-input__inner::placeholder {font-size: 14px;font-weight: 500;color: #3E534F;}// 默认框状态样式更…

C++ 12.5作业

以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a; 比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0c;动物园里有一位讲解员&…

库函数qsort的使用及利用冒泡排序模拟实现qsort

文章目录 &#x1f680;前言&#x1f680;void*类型指针&#x1f680;库函数qsort的使用&#x1f680;利用冒泡排序实现库函数qsort() &#x1f680;前言 今天阿辉将为大家介绍库函数qsort的使用&#xff0c;还包括利用冒泡排序模拟实现qsort以及void*类型的指针&#xff0c;关…