go-zero 全局异常处理-全局中间件

1、在主入口新增

package mainimport ("flag""fmt""go/application/internal/config""go/application/internal/handler""go/application/internal/middleware""go/application/internal/svc"manage "go/pkg/manage""github.com/zeromicro/go-zero/core/conf""github.com/zeromicro/go-zero/rest""github.com/zeromicro/go-zero/rest/httpx"
)var configFile = flag.String("f", "etc/service-api.yaml", "配置文件")func main() {flag.Parse()var c config.Config// 读取配置文件中的值,将其保存在c变量上  所以这一块传递的是地址conf.MustLoad(*configFile, &c)// 将全局配置保存在全局变量上config.GlobalConfig = c// 注册服务,传递服务配置server := rest.MustNewServer(c.RestConf)// 全局中间件  这儿主要用来捕获一下全局的异常,抛出给前端server.Use(middleware.WithMiddleware)// 停止服务defer server.Stop()// 为上下文赋值  将常用的方法绑定在上下文当中(redis、orm等等)ctx := svc.NewServiceContext(c)// 注册路由handler.RegisterHandlers(server, ctx)// 统一错误处理httpx.SetErrorHandler(manage.ErrHandler)fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port)// 启动服务server.Start()
}

通过server.Use(middleware.WithMiddleware) 来注册一个全局中间件,接受一个函数

2、中间件函数体

package middlewareimport ("fmt"manage "go/pkg/manage""net/http"
)func WithMiddleware(next http.HandlerFunc) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {defer func() {if err := recover(); err != nil {fmt.Println("============这儿是全局连接处理的异常===============")fmt.Println(err)fmt.Println("============这儿是全局连接处理的异常===============")manage.ResponseHandler(w, nil, &manage.ServerError)}}()next(w, r)}
}

通过defer和recover来捕获全局异常,如果出现异常,给前端返回500、服务器内部错误,并输出错误信息

3、向前端返回错误信息函数

manage->response.go

package manageimport ("net/http""github.com/zeromicro/go-zero/rest/httpx"
)type Body struct {Code    int         `json:"code"`Message string      `json:"message"`Result  interface{} `json:"data"`
}// 统一返回入口,
func ResponseHandler(w http.ResponseWriter, resp interface{}, err error) {if err != nil {httpx.OkJson(w, ErrHandler(err))// 如果err不为空的话,走错误处理函数,将err传递过去} else {// 没有错误信息,返回相应内容httpx.OkJson(w, Body{Code:    OK.Code,Message: OK.Message,Result:  resp,})}
}

manage->errorResponse.go

package managetype CodeError struct {Code    int    `json:"code"`Message string `json:"message"`
}// 实现error的接口  然后CodeError继承一下Error方法  CodeError就为error类型的返回值
func (e *CodeError) Error() string {return e.Message
}// 返回给前端的数据
func (e *CodeError) ErrorResponse() CodeError {return CodeError{Code:    e.Code,Message: e.Message,}
}// 用来自定义抛出的异常,支持调用传递
func NewCodeError(code int, msg string) error {return &CodeError{Code:    code,Message: msg,}
}// 提供new方法,任意地方传递参数返回CodeError类型的数据
func New(code int, msg string) CodeError {return CodeError{Code:    code,Message: msg,}
}// 默认异常状态码函数,只需传递错误信息即可,默认返回code-10001
func DefaultErrHandler(message string) error {return &CodeError{Code:    ServerError.Code,Message: message,}
}// 自定义错误返回函数 错误函数主入口
func ErrHandler(err error) interface{} {switch err.(type) {// 如果错误类型为CodeError,就返回错误类型的结构体case *CodeError:return errdefault:// 系统错误,500 错误提示return CodeError{Code: ServerError.Code, Message: err.Error()}}
}

manage->status.go 

package managevar (OK          = New(0, "操作成功")ReidsError  = New(6379, "redis连接失败")JwtError    = New(500, "JWT解密失败")TokenError  = New(401, "Token已过期")ServerError = New(500, "服务器内部错误")
)

搞定收工

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

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

相关文章

Hive常见问题汇总

Hive和Hadoop的关系 Hive 构建在 Hadoop 之上, HQL 中对查询语句的解释、优化、生成查询计划是由 Hive 完成的 所有的数据都是存储在 Hadoop 中 查询计划被转化为 MapReduce 任务,在 Hadoop 中执行(有些查询没有 MR 任务,如&…

Linux使用二进制包安装MySQL

目录 一、软件包下载 二、上传软件包到Linux根目录 1、使用xftp将软件包上传到根目录 2、解压缩 三、准备工作 四、初始化软件 五、设置MySQL的配置文件 六、配置启动脚本 一、软件包下载 官网下载:MySQL :: Download MySQL Community Server 二、上传软件…

数学知识第三期 欧拉函数

前言 相信大家在高中的时候接触过欧拉函数,希望大家通过本篇文章能够进一步理解欧拉函数!!! 一、什么是欧拉函数? 欧拉函数是一个在数论中用于描述特定正整数的互质数的概念。具体来说,对于一个正整数n&…

Spring扩展点在微服务应用(待完善)

ApplicationListener扩展 nacos注册服务, 监听容器发布事件 # 容器发布事件 AbstractAutoServiceRegistration#onApplicationEvent # 接收事件吗,注册服务到nacos NacosServiceRegistry#register Lifecycle扩展 #订阅服务实例更改的事件 NamingService#…

Python环境下基于机器学习的NASA涡轮风扇发动机剩余使用寿命RUL预测

本例所用的数据集为C-MAPSS数据集,C-MAPSS数据集是美国NASA发布的涡轮风扇发动机数据集,其中包含不同工作条件和故障模式下涡轮风扇发动机多源性能的退化数据,共有 4 个子数据集,每个子集又可分为训练集、 测试集和RUL标签。其中&…

文心一言 VS ChatGPT :谁是更好的选择?

前言 目前各种大模型、人工智能相关内容覆盖了朋友圈已经各种媒体平台,对于Ai目前来看只能说各有千秋。GPT的算法迭代是最先进的,但是它毕竟属于国外产品,有着网络限制、注册限制、会员费高昂等弊端,难以让国内用户享受。文心一言…

Django从入门到精通(一)

目录 一、Django环境搭建与命令 1.1、安装 1.2、命令行 创建项目 编写代码 运行 app概念 1.3、Pycharm创建项目 1.4、虚拟环境 创建虚拟环境 - 命令行 介绍 操作 基本问题 Pycharm 项目虚拟环境 django虚拟环境【安装django最新版本】 django虚拟环境【安装指…

文件包含漏洞长度截断

长度截断 文件漏洞的利用方式什么是长度截断通过实操理解00截断对版本要求更高一点,而长度截断则是利用了windows的系统漏洞,就是windows文件名(就是文件名后缀之后)之后如果有空格,或者是点都会被忽略掉,也…

【GitHub项目推荐--游戏模拟器(switch)】【转载】

01 任天堂模拟器 yuzu 是 GitHub 上斩获 Star 最多的开源 Nintendo Switch 模拟器 ,使用 C 编写,考虑到了可移植性,该模拟器包括 Windows 和 Linux 端。 如果你的 PC 满足必要的硬件要求,该模拟器就能够运行大多数商业游戏&…

Leetcode 第 111 场双周赛题解

Leetcode 第 111 场双周赛题解 Leetcode 第 111 场双周赛题解题目1:2824. 统计和小于目标的下标对数目思路代码复杂度分析 题目2:2825. 循环增长使字符串子序列等于另一个字符串思路代码复杂度分析 题目3:2826. 将三个组排序思路代码复杂度分…

Jenkins上跑自动化项目,case出现错误时,导致项目运行时间过长,该如何处理?

1、方案一:Jenkins上调整 进入配置: 构建环境: 自行选择超时时间即可~ 2、方案二:代码调整【python】 安装插件:pytest-timeout 选择一:装饰器用法:将单个测试用例标记为超时&…

Linux之安装配置CentOS 7

一、CentOS简介 CentOS(Community Enterprise Operating System,中文意思是社区企业操作系统)是Linux发行版之一,它是来自于Red Hat Enterprise Linux依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码&#xff0c…

Linux/Academy

Enumeration nmap 首先扫描目标端口对外开放情况 nmap -p- 10.10.10.215 -T4 发现对外开放了22,80,33060三个端口,端口详细信息如下 结果显示80端口运行着http,且给出了域名academy.htb,现将ip与域名写到/et/hosts中,然后从ht…

Procexp64.exe —— 强大的进程管理器

1,简介 Process Explorer 是一款增强型的任务管理器,你可以使用它方便地管理你的程序进程,能强行关闭任何程序。 除此之外,它还详尽地显示计算机信息:CPU、内存使用情况,DLL、句柄信息,很酷的…

redis-4 搭建redis集群

1.为什么需要redis集群? Redis 集群提供了高可用性、横向扩展和数据分片等功能,使得 Redis 能够应对大规模的数据存储和高并发访问的需求。以下是一些需要使用 Redis 集群的常见情况: 高可用性:通过在多个节点之间进行数据复制和…

【动态规划】【逆向思考】【C++算法】960. 删列造序 III

作者推荐 【动态规划】【map】【C算法】1289. 下降路径最小和 II 本文涉及知识点 动态规划汇总 LeetCode960. 删列造序 III 给定由 n 个小写字母字符串组成的数组 strs ,其中每个字符串长度相等。 选取一个删除索引序列,对于 strs 中的每个字符串&a…

虹科数字化与AR部门升级为安宝特AR子公司

致关心虹科AR的朋友们: 感谢您一直以来对虹科数字化与AR的支持和信任,为了更好地满足市场需求和公司发展的需要,虹科数字化与AR部门现已升级为虹科旗下独立子公司,并正式更名为“安宝特AR”。 ”虹科数字化与AR“自成立以来&…

React中文官网已经搬迁了,原网址内容将不再更新

注意1:React中文官网已经搬迁至-React 官方中文文档,原网址内容将不再更新 注意2:React官网已经将React的定义由“用于构建用户界面的 JavaScript 库”更改为“用于构建 Web 和原生交互界面的库”。

SpringBoot系列之JPA实现按年月日查询

SpringBoot系列之JPA实现按年月日查询 通过例子的方式介绍Springboot集成Spring Data JPA的方法,进行实验,要先创建一个Initializer工程,如图: 选择,需要的jdk版本,maven项目 选择需要的maven配置&#x…

Python初学者学习记录——python基础综合案例:数据可视化——地图可视化

一、基础地图使用 1、基础地图演示 2、基础地图演示——视觉映射器 from pyecharts.charts import Map from pyecharts.options import VisualMapOpts# 准备地图对象 map Map() # 准备数据 data [("北京市", 99),("上海市", 199),("湖南省", 2…