Golang中使用errors返回调用堆栈信息

 更新时间:2023年12月15日 09:22:17   作者:毛小子  
这篇文章给大家介绍了Golang中如何使用errors返回调用堆栈信息,文章通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

Golang的errors包返回堆栈信息

标准库errors提供了处理错误的方法。比如常用的
func New(text string) error

用该方法处理错误信息,就只会输出自定义的 text 到控制台或者日志文件,

没有其它辅助排查的信息输出,所以常规我们就只能根据 text 去全局搜哪里抛出了这个错误,再来定位代码层面上下文问题。

当然,不是不行,但是嵌套代码多,抛出 text 存在多处一致的情况,就比较麻烦了。比如以下例子:

package main

import (
	"errors"
	"fmt"
	"os"
)

func err1() error {
	return errors.New("报错啦,抛出异常!!")
}

func err2() error {
	return errors.New("报错啦,抛出异常!!")
}

func err3() error {
	return errors.New("报错啦,抛出异常!!")
}

func main() {
	err := err1()
	if err != nil {
		fmt.Println(err)
		os.Exit(0)
	}
	err = err2()
	if err != nil {
		fmt.Println(err)
		os.Exit(0)
	}
	err = err3()
	if err != nil {
		fmt.Println(err)
		os.Exit(0)
	}
}

运行结果:

报错啦,抛出异常!!

代码中有三处同样的错误输出,根据这个错误信息,无法判断是来源于哪个方法,只能通过调试或者在每个 err!=nil 内再加输出进行定位。

这里就可以用第三方的开源库:github.com/go-errors/errors

下面用 github.com/go-errors/errors改造下

package main

import (
	"fmt"
	"github.com/go-errors/errors"
	"os"
)

func err1() error {
	return nil
}

func err2() error {
	return errors.New("报错啦,抛出异常!!")
}

func err3() error {
	return errors.New("报错啦,抛出异常!!")
}

func main() {
	err := err1()
	if err != nil {
		fmt.Println(err.(*errors.Error).ErrorStack())
		os.Exit(0)
	}
	err = err2()
	if err != nil {
		fmt.Println(err.(*errors.Error).ErrorStack())
		os.Exit(0)
	}
	err = err3()
	if err != nil {
		fmt.Println(err.(*errors.Error).ErrorStack())
		os.Exit(0)
	}
}

运行结果:

*errors.Error 报错啦,抛出异常!!  
D:/gotest/src/test/main.go:14 (0x49756b)  
        main: return errors.New("报错啦,抛出异常!!")
D:/gotest/src/test/main.go:27 (0x497559)
        main: err = err2()
D:/golang/src/runtime/proc.go:250 (0x4379fe)
        main: fn()
D:/golang/src/runtime/asm_amd64.s:1594 (0x45ee41)
        goexit: BYTE $0x90 // NOP

有了调用堆栈信息,就很明确知道 err2()存在问题。这个库会记录调用栈,通过ErrorStack方法返回调用栈信息

以上就是Golang中使用errors返回调用堆栈信息的详细内容,更多关于Golang errors返回堆栈信息的资料请关注脚本之家其它相关文章!

相关文章

  • 让goland支持proto文件类型的实现

    让goland支持proto文件类型的实现

    这篇文章主要介绍了让goland支持proto文件类型的实现操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go语言sync锁与对象池的实现

    Go语言sync锁与对象池的实现

    本文介绍了Go语言标准库sync包提供的并发控制工具,主要包括互斥锁(sync.Mutex)和读写锁(sync.RWMutex)两类同步机制,下面就来具体介绍一下这两个的使用,感兴趣的可以了解一下
    2025-08-08
  • 如何用go操作iptables和ipset设置黑白名单

    如何用go操作iptables和ipset设置黑白名单

    这篇文章主要介绍了如何用go操作iptables和ipset设置黑白名单问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • GoLang切片并发安全解决方案详解

    GoLang切片并发安全解决方案详解

    这篇文章主要介绍了GoLang切片并发安全问题的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10
  • Golang CSP并发机制及使用模型

    Golang CSP并发机制及使用模型

    这篇文章主要为大家介绍了Golang CSP并发机制及使用模型,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • GO中 分组声明与array, slice, map函数

    GO中 分组声明与array, slice, map函数

    这篇文章主要介绍了GO中 分组声明与array,slice,map函数,Go语言中,同时声明多个常量、变量,或者导入多个包时,可采用分组的方式进行声明,下面详细介绍需要的小伙伴可以参考一下
    2022-03-03
  • Golang::slice和nil的对比分析

    Golang::slice和nil的对比分析

    这篇文章主要介绍了Golang::slice和nil的对比分析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go通过SJSON实现动态修改JSON

    Go通过SJSON实现动态修改JSON

    在Go语言 json 处理领域,在 json 数据处理中,读取与修改是两个核心需求,本文我们就来看看如何使用SJSON进行动态修改JSON吧,有需要的小伙伴可以了解下
    2025-03-03
  • go micro集成链路跟踪的方法和中间件原理解析

    go micro集成链路跟踪的方法和中间件原理解析

    这篇文章主要介绍了go-micro集成链路跟踪的方法和中间件原理,关于Http或者说是Restful服务的链路跟踪,go-micro的httpClient支持CallWrapper,可以用WrapCall来添加链路跟踪的CallWrapper,本文给大家介绍的非常详细,需要的朋友参考下吧
    2022-05-05
  • Golang 如何限制木马图片上传服务器的实例

    Golang 如何限制木马图片上传服务器的实例

    本文主要介绍了Golang 如何限制木马图片上传服务器的实例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02

最新评论