Golang 一个支持错误堆栈, 错误码, 错误链的工具库

这篇具有很好参考价值的文章主要介绍了Golang 一个支持错误堆栈, 错误码, 错误链的工具库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

介绍

来腾讯之后主要使用go, 在业务开发中需要一个支持错误码对外返回, 堆栈打印等能力的错误工具库, 先开始使用pkg/errors, 但该项目已经只读, 上次更新是几年前, 而且有一些点比如调整堆栈深度等没有支持, 后续根据业务的需要抽取了一个通用库, 且做了一些优化, 详见下方.

地址: https://github.com/morrisxyang/errors
如果觉得有用欢迎 Star 和 PR, 有问题请直接提issue

errors

Golang 一个支持错误堆栈, 错误码, 错误链的工具库

简单的支持错误堆栈, 错误码, 错误链的工具库:

  • 支持携带堆栈, 嵌套构造错误链

  • 支持携带错误码, 方便接口返回

  • 支持自定义堆栈打印深度和错误链打印格式

  • 使用 CallersFrames 替代 FuncForPC 生成堆栈, 避免特殊情况line number错误等问题, 详见runtime: strongly encourage using CallersFrames over FuncForPC with Callers result

  • 简化堆栈信息, 一条链路多次Wrap操作只保留最深层堆栈, 只打印一次

安装和文档

安装使用 go get github.com/morrisxyang/errors

文档地址是 https://pkg.go.dev/github.com/morrisxyang/errors

快速开始

构造错误链

func a() error {
   err := b()
   err = Wrap(err, "a failed reason")
   return err
}

func b() error {
   err := c()
   err = Wrap(err, "b failed reason")
   return err
}

func c() error {
   _, err := os.Open("test")
   if err != nil {
      return WrapWithCode(err, 123, "c failed reason")
   }
   return nil
}

打印错误信息, %+v会打印堆栈, %v只打印错误信息

a failed reason
Caused by: b failed reason
Caused by: 123, c failed reason
Caused by: open test: no such file or directory
github.com/morrisxyang/errors.c
   /Users/morrisyang/Nutstore Files/go-proj/githuberrors/errors_test.go:94
github.com/morrisxyang/errors.b
   /Users/morrisyang/Nutstore Files/go-proj/githuberrors/errors_test.go:86
github.com/morrisxyang/errors.a
   /Users/morrisyang/Nutstore Files/go-proj/githuberrors/errors_test.go:80
....堆栈信息省略

核心方法

错误封装

  • func New(msg string) error
  • func Newf(format string, args …interface{}) error
  • func NewWithCode(code int, msg string) error
  • func NewWithCodef(code int, format string, args …interface{}) error
  • func Wrap(e error, msg string) error
  • func Wrapf(e error, format string, args …interface{}) error
  • func WrapWithCode(e error, code int, msg string) error
  • func WrapWithCodef(e error, code int, format string, args …interface{}) error

错误解析

  • func Code(e error) int
  • func EffectiveCode(e error) int
  • func Msg(e error) string
  • func As(err error, target interface{}) bool
  • func Is(err, target error) bool
  • func Cause(e error) error
  • func Unwrap(err error) error

配置

  • type Config

    • func GetCfg() *Config
  • func ResetCfg()

  • func SetCfg(c *Config)

FAQ

  1. 多次 Wrap 错误会携带多次堆栈吗?

    可在调用链路上多次Wrap, 添加说明信息, 但只有最深层的Wrap操作会设置堆栈, 继续 Wrap, return err 等操作不会影响堆栈信息

  2. 在链路中某个错误设置了合适的错误码, 然后继续Wrap时没有设置, 如何获取?

    建议在合适的清晰的时机设置有效的错误码, 可以使用EffectiveCode获取链路中外层第一个有效的非0错误码, 由于系统调用等情况, 同一链路中可能有多个错误携带错误码, 此时默认外层的错误码应该对外暴露, 屏蔽了内层的详细信息.文章来源地址https://www.toymoban.com/news/detail-509098.html

到了这里,关于Golang 一个支持错误堆栈, 错误码, 错误链的工具库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 编写并调试一个堆栈溢出的程序

    编写存在栈溢出漏洞的 c++ 程序: stack_overflow.cpp 对于 GCC 编译器,可以尝试使用 -fno-stack-protector ​ 选项来禁用堆栈保护。 使用 -g ​使其可调试 编译命令: g++ stack_overflow.cpp -o stack_overflow -g -fno-stack-protector ​ ‍ 使用 gdb 查看 stack_overflow 函数的地址:0x000055555555520e 命令是

    2024年03月26日
    浏览(40)
  • 推荐一个日历转换开源工具库,支持C#、Java、PHP等主流的语言

    日历对我们来说,最熟悉的就是阳历和农历,在中国每年都有固定的节日、节气、中国特有传统节日,有些节日是固定的,但是节气这些都需要我们经过一定规则换算出来。 所以,今天给大家推荐一个开源库,它支持阳历、阴历、佛历和道历的日历转换,可以满足我们的所有

    2024年02月06日
    浏览(61)
  • 【ollama】(3):在linux搭建环境中,安装golang开发的ollama工具,并且完成启动下载gemma:7b和qwen:1.8b运行速度飞快,支持http接口和命令行模式

    https://www.bilibili.com/video/BV19F4m1F7Rn/ 【ollama】(3):在linux搭建环境中,安装ollama工具,并且完成启动下载gemma:7b和qwen:1.8b运行速度飞快,支持http接口和命令行 https://ollama.com/ 项目使用golang+llama.cpp 项目进行开发的。 简化了模型的安装,非常的方便。 然后因为是docker 虚拟环境

    2024年04月13日
    浏览(31)
  • 一个在线ER模型设计工具:支持数据库设计、生成、反向工程、优化和文档生成等操作

    ER模型,即实体关系模型,是数据库建模的一种重要方法。它可以帮助开发人员更好地理解数据库结构,并确定数据库的概念模型。在本文中,我们将详细介绍ER模型设计的基本概念和过程。 首先,我们需要了解ER模型中的两个基本概念:实体和关系。实体是数据库中存储的对

    2024年02月04日
    浏览(52)
  • Android T 远程动画显示流程其一——整体流程以及堆栈介绍

    本地动画和远程动画区别是什么? 本地动画:自给自足。对自身SurfaceControl矢量动画进行控制。 远程动画:拿来吧你!一个app A对另一个app B通过binder跨进程通信,控制app B的SurfaceControl矢量动画。 无论是本地动画还是远程动画,都仅仅只是对SurfaceControl动画图层控制,而无法控

    2024年04月11日
    浏览(72)
  • C/C++数据结构---在一个数组中实现两个堆栈(PTA)

    个人主页 仍有未知等待探索_数据结构,C语言疑难,小项目-CSDN博客 专题分栏---数据结构 数据结构_仍有未知等待探索的博客-CSDN博客 目录 一、前言         二、题目 要求 函数接口定义 裁判测试程序样例 输入样例  输出样例  三、分析  1.栈的特点 2.题目分析  3.栈的创建

    2024年02月08日
    浏览(34)
  • 介绍一个强大的免费开源.net反编译工具

    dnSpy 是一个用C#开发,开源的调试器和.NET 汇编编辑器。 即使您没有任何可用的源代码,也可以使用它来编辑和调试程序,并可以把代码导出成.net工程。

    2024年01月17日
    浏览(36)
  • scalpel一款命令行漏洞扫描工具,支持深度参数注入,拥有一个强大的数据解析和变异算法

    免责声明 由于传播、利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!所有工具安全性自测!!! 工具介绍 scalpel是一款

    2024年01月19日
    浏览(33)
  • Full-Scanner是一个多功能扫描工具,支持被动/主动信息收集,漏洞扫描工具联动,可导入POC和EXP

    github项目地址:https://github.com/Zhao-sai-sai/Full-Scanner gitee项目地址:https://gitee.com/wZass/Full-Scanner 做挖漏洞渗透测试有的时候要去用这个工具那个工具去找感觉麻烦我自己就写了一个简单的整合工具,有互联网大佬不要喷我,我也是废物 Full-Scanner是一个多功能扫描工具,支持被动

    2024年02月06日
    浏览(34)
  • jstack(Stack Trace for Java)Java堆栈跟踪工具

    jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为 threaddump 或者 javacore文件 )。 线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的目的通常是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源

    2024年02月12日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包