全局异常处理器

后端:

全局异常处理器的作用:

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

不过我们不可能每个异常都用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,一经查实,立即删除!

相关文章

数组中的map方法

JavaScript中的map()方法详解 map()方法经常拿来遍历数组&#xff0c;但是不改变原数组&#xff0c;但是会返回一个新的数组&#xff0c;并且这个新的数组不会改变原数组的长度 注意&#xff1a;有时候会出现这种现象&#xff0c;出现几个undefined const array [1, 4,9, 16…

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

随着数字人应用场景的不断拓展&#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 应届生面试指南 网络安全面…

Sheila Teo分享GPT-4提示工程竞赛胜利经验,DynamiCrafter工具实现图转超逼真动态视频

一支烟花官网&#xff1a; https://agifun.love 智源社区 我是如何赢得GPT-4提示工程大赛冠军的 Datawhale干货作者&#xff1a;Sheila Teo&#xff0c;来源&#xff1a;机器之心去年 11 月 8 日&#xff0c;新加坡政府科技局&#xff08;GovTech&#xff09;组织举办了首届…

ISO七层模型 tcp/ip

OSI七层模型&#xff08;重点例子&#xff09; OSI&#xff08;Open Systems Interconnection&#xff09;模型&#xff0c;也称为开放系统互连模型&#xff0c;是一个理论模型&#xff0c;由国际标准化组织&#xff08;ISO&#xff09;制定&#xff0c;用于描述和理解不同网络…

Web前端机试题深度剖析:挑战与策略

Web前端机试题深度剖析&#xff1a;挑战与策略 在数字时代的浪潮中&#xff0c;Web前端开发作为连接技术与用户的关键环节&#xff0c;其重要性不言而喻。在求职或技能考核中&#xff0c;机试题往往是检验前端开发者能力的重要手段。本文将围绕Web前端机试题&#xff0c;从四个…

bash脚本无法设置环境变量?你需要了解 source 和 sh 的区别

问题背景 有时需要通过脚本设置环境变量&#xff0c;但是发现脚本可以正常执行&#xff0c;但是环境变量没有任何更改。 假设有脚本内容如下&#xff1a; #!/bin/bashexport TEMP1尝试执行&#xff0c;可以发现&#xff1a; 以 sh 方式执行的时候&#xff0c;无法设置环境变…

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

如何利用智能家居打造一个“会呼吸的家”&#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 语言的国际标准化组织制…

ffmpeg封装和解封装介绍-(7)截断视频关键代码解析

计算相关pts并移动到第10s处的pts&#xff1a; /// 截取10 ~ 20 秒之间的音频视频 取多不取少// 假定 9 11秒有关键帧 我们取第9秒double begin_sec 10.0; //截取开始时间double end_sec 20.0; //截取结束时间long long begin_pts 0;long long begin_audio_pts 0; …

【深度学习】基于NNCLR模型的计算机视觉自监督学习过程

1.引言 1.1.自监督学习研究的背景 进行自监督学习的研究具有深远的意义&#xff1a; 首先&#xff0c;自监督学习能够有效减少对标注数据的依赖。在实际应用中&#xff0c;获取大量标注数据往往需要消耗大量的时间和人力资源&#xff0c;特别是在一些专业领域&#xff0c;如…

Spring中自定义注解进行类方法增强

说明 说到对类方法增强&#xff0c;第一时间想到自定义注解&#xff0c;通过aop切面进行实现。这是一种常用做法&#xff0c;但是在某些场景下&#xff0c;如开发公共组件&#xff0c;定义aop切面可能不是最优方案。以后通过原生aop方式&#xff0c;自定义注解&#xff0c;对类…

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;旨在兼顾教学和企业科研能力。实验室需…