全局异常处理器

后端:

全局异常处理器的作用:

当我们在项目中碰到很多不同的异常情况时,我们需要去处理异常

不过我们不可能每个异常都用try/catch,那样很不优雅

所以我们可以用这个全局异常处理器,来优雅的处理异常

这个全局异常处理器说白了就是把项目的所有异常统一管理,一起抛出

异常的走向:

因为我们是controller调用service再调用mapper,
只要碰到异常我们就会往上抛,如果mapper层碰到异常,就会一层一层抛到controller,然后再抛向浏览器
所以最后在浏览器页面上就会显示500(服务器端异常)

全局异常处理器怎么用:

1:定义封装异常类:

比如:

package com.usercenter.usercenterproject.exception;
import com.usercenter.usercenterproject.Pojo.ErrorCode;
/*** 自定义异常类**/
public class BusinessException extends RuntimeException {/*** 异常码*/private final int code;/*** 描述*/private final String description;public BusinessException(String message, int code, String description) {super(message);this.code = code;this.description = description;}public BusinessException(ErrorCode errorCode) {super(errorCode.getMessage());this.code = errorCode.getCode();this.description = errorCode.getDescription();}public BusinessException(ErrorCode errorCode, String description) {super(errorCode.getMessage());this.code = errorCode.getCode();this.description = description;}public int getCode() {return code;}public String getDescription() {return description;}
}

2:定义不同异常的提示:

这里我用的时枚举,当然创建一个类来定义这些不同异常的处理信息也行。

package com.usercenter.usercenterproject.Pojo;/*** 错误码*/
public enum ErrorCode {SUCCESS(0, "ok", ""),PARAMS_ERROR(40000, "请求参数错误", ""),NULL_ERROR(40001, "请求数据为空", ""),NOT_LOGIN(40100, "未登录", ""),NO_AUTH(40101, "无权限", ""),SYSTEM_ERROR(50000, "系统内部异常", "");private final int code;/*** 状态码信息*/private final String message;/*** 状态码描述(详情)*/private final String description;ErrorCode(int code, String message, String description) {this.code = code;this.message = message;this.description = description;}public int getCode() {return code;}public String getMessage() {return message;}// https://t.zsxq.com/0emozsIJhpublic String getDescription() {return description;}
}

3:定义全局异常处理器:

package com.usercenter.usercenterproject.exception;import com.usercenter.usercenterproject.Pojo.BaseResponse;
import com.usercenter.usercenterproject.Pojo.ErrorCode;
import com.usercenter.usercenterproject.Pojo.ResultUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;/*** 全局异常处理器**/
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {@ExceptionHandler(BusinessException.class)public BaseResponse<?> businessExceptionHandler(BusinessException e) {log.error("businessException: " + e.getMessage(), e);return ResultUtils.error(e.getCode(), e.getMessage(), e.getDescription());}@ExceptionHandler(RuntimeException.class)public BaseResponse<?> runtimeExceptionHandler(RuntimeException e) {log.error("runtimeException", e);return ResultUtils.error(ErrorCode.SYSTEM_ERROR, e.getMessage(), "");}
}
全局异常处理器中出现的注释:

@RestControllerAdvice = @ControllerAdvice + @ResponseBody
这个注解还可以把返回的Result对象封装成json格式的对象返回给前端。
@ExceptionHandler 这个注解也是用来表明我们需要捕获什么异常
这段代码中的参数Exception.class 表明我们要捕获所有的异常。

 前端:

我主攻是后端,前端我就单纯只是记录一下,以后如果有在前端深造,我再回来补。

应用场景:我们需要对接口的通用响应进行统一处理,比如从response中取出data。

我觉得对于这种全局响应处理的操作,可以理解为SpringAOP。

代码:

/*** request 网络请求工具* 更详细的 api 文档: https://github.com/umijs/umi-request*/
import {extend} from 'umi-request';
import {message} from "antd";
import {history} from "@@/core/history";
import {stringify} from "querystring";/*** 配置request请求时的默认参数*/
const request = extend({credentials: 'include', // 默认请求是否带上cookieprefix: process.env.NODE_ENV === 'production' ? 'http://user-backend.code-nav.cn' : undefined// requestType: 'form',
});/*** 所以请求拦截器*/
request.interceptors.request.use((url, options): any => {console.log(`do request url = ${url}`)return {url,options: {...options,headers: {},},};
});/*** 所有响应拦截器*/
request.interceptors.response.use(async (response, options): Promise<any> => {const res = await response.clone().json();if (res.code === 0) {return res.data;}if (res.code === 40100) {message.error('请先登录');history.replace({pathname: '/user/login',search: stringify({redirect: location.pathname,}),});} else {message.error(res.description)}return res.data;
});export default request;
记录一下踩坑点:

就是你自己新写了一个处理器之后,你就要在你的api.ts文件中的引入你也得记得改

原来的是引用umi框架中的{request}

得换成自己写的这个

要不然就是出现你打开localhost:8080的时候,直接跳过登录页面,直接进去,并且查询不到任何信息。

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

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

相关文章

数字人系统源码开发攻略,小白也能轻松上手的部署方案来了!

随着数字人应用场景的不断拓展&#xff0c;数字人广阔的应用前景和庞大的市场需求逐渐展现在人们眼前。但是&#xff0c;由于专业背景的缺乏&#xff0c;许多想要开发数字人系统的创业者们都只能被迫成为旁观他人瓜分这块大蛋糕。在此背景下&#xff0c;各式各样的数字人系统源…

[论文笔记]Query Rewriting for Retrieval-Augmented Large Language Models

引言 今天带来论文Query Rewriting for Retrieval-Augmented Large Language Models的笔记。 本篇工作从查询重写的角度介绍了一种新的框架&#xff0c;即重写-检索-阅读&#xff0c;而不是以前的检索-阅读方式&#xff0c;用于检索增强的LLM。关注的是搜索查询本身的适应性&…

检索增强生成(RAG)实践:基于LlamaIndex和Qwen1.5搭建智能问答系统

什么是 RAG LLM 会产生误导性的 “幻觉”&#xff0c;依赖的信息可能过时&#xff0c;处理特定知识时效率不高&#xff0c;缺乏专业领域的深度洞察&#xff0c;同时在推理能力上也有所欠缺。 正是在这样的背景下&#xff0c;检索增强生成技术&#xff08;Retrieval-Augmented…

[Python学习篇] Python循环语句

while 循环 语法&#xff1a; while 条件: 条件成立后会重复执行的代码 ...... 示例1&#xff1a;死循环 # 这是一个死循环示例 while True:print("我正在重复执行")示例2&#xff1a;循环指定次数 i 1 while i < 5:print(f"执行次数 {i}")…

学了这篇面试经,轻松收割网络安全的offer

网络安全面试库 吉祥学安全知识星球&#x1f517;除了包含技术干货&#xff1a;Java代码审计、web安全、应急响应等&#xff0c;还包含了安全中常见的售前护网案例、售前方案、ppt等&#xff0c;同时也有面向学生的网络安全面试、护网面试等。 0x1 应届生面试指南 网络安全面…

如何利用智能家居打造一个“会呼吸的家”?一体化电动窗帘

如何利用智能家居打造一个“会呼吸的家”&#xff1f;一体化电动窗帘 史新华 隐藏式一体化智能电动窗帘与市面上其他窗帘不同的是&#xff0c;电机内置于轨道之中&#xff0c;一体化&#xff0c;美观、安静、滑动顺畅。 每次都会自动打开和关闭&#xff0c;相当漂亮。 众多家庭…

javaWeb项目-ssm+vue在线购物系统功能介绍

本项目源码&#xff1a;java-ssmvue在线购物系统的设计与实现源码说明文档资料资源-CSDN文库 项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;sprin…

网络基础OSI国际互联

这里所指的网络是计算机网络&#xff0c;由许许多多的不同的网络设备以及电子设备构建的一个ip的网络&#xff0c;这个就是工作对象 网络是随着计算机的出现&#xff0c;军事沟通 出现的问题&#xff1a;物理层设备&#xff0c;总线&#xff0c;共享设备&#xff0c;会产生冲突…

【前端速通系列|第一篇】ES6核心语法

文章目录 1.ES6简介2.let和const3.解构4.链判断5.参数默认值6.箭头函数7.模板字符串8.Promise9.Async函数10.Await关键字11.模块化 1.ES6简介 ES6 是 ECMAScript 2015 的缩写&#xff0c;是 ECMAScript 语言标准的第6个版本。ECMAScript 是 JavaScript 语言的国际标准化组织制…

jpg图片下载后如何转换格式?方法揭秘(全)

在互联网浏览中&#xff0c;我们经常下载到各种各样的图片文件&#xff0c;而JPEG&#xff08;JPG&#xff09;是其中一种常见的格式。尽管JPEG在保持图像质量的同时能够有效地压缩文件大小&#xff0c;但有时我们可能需要将下载的JPEG图片转换为其他格式&#xff0c;以满足不同…

Python基于 Jupyter Notebook 的图形可视化工具库之ipysigma使用详解

概要 在数据科学和网络分析中,图(Graph)结构是一种常用的数据结构,用于表示实体及其关系。为了方便图数据的可视化和交互操作,ipysigma 提供了一个基于 Jupyter Notebook 的图形可视化工具。通过 ipysigma,用户可以在 Jupyter Notebook 中创建、编辑和展示图结构,方便进…

流体性能测试实验室建设需求参考

在第一次提需求的时候&#xff0c;很多人感到很迷茫&#xff0c;这里以某流体实验室建设为例&#xff0c;进行说明&#xff0c;希望抛砖引玉&#xff0c;能起到一点参考作用。 一、项目概述 学校拟建一座流体性能测试实验室&#xff0c;旨在兼顾教学和企业科研能力。实验室需…

开源大模型的新星:ChatGPT-Next-Web 项目解析与推荐

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

物业客服“逆袭”记:从被质疑到被点赞,只因用了这款小程序

作为物业服务企业来说&#xff0c;物业客服人员是物业公司的核心部门。客服人员不仅仅要进行各部门之间的工作协调沟通&#xff0c;而且也是物业与业主沟通的主要桥梁。但是&#xff0c;往往客服人员经常被传统的报修方式所困扰&#xff0c;导致业主对物业客服人员存在质疑与谩…

机器视觉:光源的类型以及主要参数

光源在机器视觉中起着决定性的作用&#xff0c;决定了视觉算法的复杂性&#xff0c;也决定了视觉系统的精度和稳定性。光源用于突出目标物体的特征&#xff0c;增加目标物体与背景的对比度&#xff0c;克服环境光线的干扰。光源的选择与打光方式在视觉系统的前期评估中非常重要…

蓝牙体脂秤智能化方案模组

蓝牙体脂秤原理跟普通电子体重秤的原理差不多&#xff0c;都是利用压力传感器及芯片设计完成功能的实现。蓝牙电子秤的外形和地面有四个接触点&#xff0c;四个接触点那里都放着一种压力传感器&#xff0c;压力传感器将人体的重量转换成电信号&#xff0c;后经过芯片设计完成处…

【网络编程开发】7.TCP可靠传输的原理

7.TCP可靠传输的原理 TCP实现可靠传输的原理主要基于序列号和确认应答、超时重传、滑动窗口、连接管理机制以及拥塞控制等多重机制。 TCP&#xff08;Transmission Control Protocol&#xff09;&#xff0c;即传输控制协议&#xff0c;是网络通信中的一种重要协议&#xff0…

数据结构和矩阵细节用法:double、cell和complex #matlab

矩阵建立 建立矩阵用[]&#xff1b; 矩阵的同一行内的元素用逗号或者空格隔开&#xff1b; 矩阵的不同行的元素用分号隔开 eg. 矩阵 A 1 2 3 4 5 6 7 8 9 在matlab中矩阵A表示为&#xff1a; clc;clear; A[1,2,3;4,5,6;7,8,9]; %或者A[1 2 3;4 5 …

C++的异常捕获

目录 C语言的异常处理方式 C的异常处理方式 异常的抛出与捕获 抛出与捕获原则 异常安全 C语言的异常处理方式 1、终止程序 常见形式&#xff1a;assert 缺陷&#xff1a;太过强硬&#xff0c;如果发生内存错误&#xff0c;或者除0语法错误等就会直接终止程序 2、返回错误码…

for 、while循环

练习1&#xff1a;输入一个数&#xff0c;判断是否是完美数 完美数&#xff1a;正序和逆序的结果一致 练习2&#xff1a; * ** *** **** 练习3&#xff1a; **** *** ** * 练习4&#xff1a;输入一个数&#xff0c;计算最大公约数&#xff0c;以及最小公倍数 练习5&#xff…