首页 > 其他分享 >go自定义了一个Code的错误代码类型

go自定义了一个Code的错误代码类型

时间:2024-02-20 17:57:49浏览次数:40  
标签:Code return 自定义 err 错误代码 code consts error

第一次基于GoFrame框架开发项目,这是一个灵感来自PHP Laravel的Golang开发框架,使用之后其实自己并不是很喜欢,把一个开发语言的习惯直接迁移到另一个开发语言上,个人觉得并不是一个好主意,不过这次并不想讨论这个。

同事之前的实践

异常处理是每个框架都需要考虑的问题,GoFrame也有自己的设计,可以看他们的官方文档。同事基于自己的实践经验,建议参考:

上面是关于异常的定义,在使用的时候:

这其实就是仿照其他语言的抛出异常,然后在外部使用Try语句进行捕获,这确实是可以的,不过这并不是Golang所提倡的。Golang之所以没有实现类似其他语言的try catch语句,是有自己的考量的,它是希望所有异常都能得到显式的处理,于是都是采用return返回的形式,有时这写法确实挺啰嗦,但这不失为一种好习惯。

另外,如果异常文本都完全跟异常code值绑定在一起,有时就比较难区分,例如“json字符串解释错误”,如果系统中很多地方都有这个错误,可能这个异常信息对于排查问题就不是很直接。

我的实现

基于以上的考虑,最终关于异常的定义:

图片

定义了一个Code的错误代码类型。

配套工具函数:

package utils
import ( "fmt"
"git.ibbd.net/ai/knowledge-base-backend/v1/internal/consts" "github.com/gogf/gf/v2/errors/gcode" "github.com/gogf/gf/v2/errors/gerror")
// 错误信息包装// 避免错误信息被重复包装func ErrorWrap(code consts.Code, err error) error { if _, ok := err.(*gerror.Error); ok { return err } return errorWrap(code, err)}
// 格式化自定义错误func Errorf(code consts.Code, format string, a ...interface{}) error { err := fmt.Errorf(format, a...) return errorWrap(code, err)}
func errorWrap(code consts.Code, err error) error { msg := fmt.Sprintf("%s: %s", consts.ErrMessages[code], err.Error()) codeObj := gcode.New(int(code), msg, "") return gerror.NewCode(codeObj, codeObj.Message())}

主要是两个包装函数:

  • Errorf:使用字符串生成error;

  • ErrorWrap:对本身已经是error的变量进行包装,如果本身已经是gerror.Error类型的,则直接返回,避免在传递过程中被重复包装;

使用样例代码大概如下:

func (s *sApplication) CheckMatchWithClass(ctx context.Context, appId, appSecret string) (err error) {  count, err := dao.Application.Ctx(ctx).    Where(dao.Application.Columns().Id, appId).    Where(dao.Application.Columns().Password, appSecret).    Where(dao.Application.Columns().Class, appClass).    Count()  if err != nil {    err = utils.Errorf(consts.CodeDbOperation, "应用ID与密钥匹配SQL异常, app id: %s, app secret: %s, err: %s", appId, appSecret, err)    return  }  if count != 1 {    err = utils.Errorf(consts.CodeAppNotMatch, "应用ID与应用密钥不匹配(注意应用状态及应用类似是否匹配), app id: %s, app secret: %s", appId, appSecret)    return  }  return}

这应该才是比较Golang的方式。

标签:Code,return,自定义,err,错误代码,code,consts,error
From: https://www.cnblogs.com/cheyunhua/p/18023694

相关文章

  • Leetcode刷题第十天-动态规划
    ......
  • AtCoder Beginner Contest 339
    B-Langton'sTakahashi难度:⭐⭐题目大意给定一个n*m的网格,并且每一行和每一列都是首尾相连的,每行的最后一个格子再往右就是这行的第一个格子,第一个格子向左就是最后一个格子;列也同理;默认每个格子初始为白色;小莫位于(1,1),方向朝上;当小莫位于某个格子......
  • err code 90030,err msg webhook over limit
    钉钉群机器人发文本消息提示"webhookoverlimit"从2024.02.01钉钉修改了自定义机器人推送政策,免费额度,由之前的不限制,改为:目前钉钉已经限制了免费版的发送次数每个企业每月5000条(之前创建的外部群不限制,但是已经不能新增机器人了。)。钉钉收费版是9800元每年,然后每月5w条(如果......
  • 【前端开发】VSCode下载安装教程,新手入门(超详细)附安装包
    ​1.VSCode简介        VSCode,全称VisualStudioCode,是一款由微软开发的跨平台源代码编辑器,可用于Windows、Linux和macOS操作系统。以下是对VSCode的详细介绍:功能丰富:VSCode支持语法高亮、代码自动补全(又称IntelliSense)、代码重构、查看定义功能,并内置了命令行工......
  • Codeforces 1806E Tree Master
    考虑一个最基础的暴力,就是直接记忆化搜索暴力往上跳。但是能发现如果一层的节点数过多,状态数太多,就寄了。再考虑一个基础的暴力,就是直接跳。但是如果要跳的层数过多,就寄了。考虑结合一下,根号分治。对于一层内节点数\(\le\sqrt{n}\)的记录下每两个点间的答案。对于节点数......
  • Codeforces Round 928(Div. 4)
    Dashboard-CodeforcesRound928(Div.4)-Codeforces第一次参加CF,最后一道题连题都没读,下次不会就跳,菜是原罪A:找字符串中A,B数量,遍历一下最后比较即可B:判断是三角形还是正方形,题目表示除了正方形就是三角形,所以直接判断是不是正方形,用ans数组记录每一行1的个数,然后从大......
  • vscode ssh: Resolver error: Error: XHR failedscode错误
    https://blog.csdn.net/m0_38040006/article/details/126752751https://devpress.csdn.net/cloud-native/64f81cf9993dd34278ee1143.html?dp_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6NDUwNjkxNiwiZXhwIjoxNzA5MDE3MzcxLCJpYXQiOjE3MDg0MTI1NzEsInVzZXJuYW1lIjoi......
  • Codeforces Round 900 (Div. 3)
    题目A.只要k出现过就是YES#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;#defineinf0x3f3f3f3fvoidsolve(){intn,k;cin>>n>>k;map<int,int>mp;for(inti=0,x;i<n;i++){cin......
  • Codeforces Round 928 (Div. 4) (小白的复盘)
    A.VladandtheBestofFive思路:给你一个长度字符串只包含A和B输出最多的字符解法:按题意来Code:#include<bits/stdc++.h>usingnamespacestd;intmain(){intt;cin>>t;while(t--){strings;cin>>s;intcnt=0;fo......
  • Codeforces Round 928 (Div. 4)(A、B、C、D、E、G)
    目录ABCDEGA统计A、B输出#include<bits/stdc++.h>#defineintlonglong#definerep(i,a,b)for(inti=(a);i<=(b);++i)#definefep(i,a,b)for(inti=(a);i>=(b);--i)#definepiipair<int,int>#definelllonglong#definedbdouble#de......