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返回堆栈信息的资料请关注脚本之家其它相关文章!

相关文章

  • go责任链行为型设计模式Chain Of Responsibility

    go责任链行为型设计模式Chain Of Responsibility

    这篇文章主要为大家介绍了go行为型设计模式之责任链Chain Of Responsibility使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Go语言中Seeker接口的用法详解

    Go语言中Seeker接口的用法详解

    Go语言标准库中的io包提供了一系列接口,用于处理各种I/O操作,其中Seeker接口在处理大文件或需要随机访问的场景中非常有用,本文将结合具体案例,详细介绍Go语言中io包的Seeker接口的用法,需要的朋友可以参考下
    2024-10-10
  • 解决golang时间字符串转time.Time的坑

    解决golang时间字符串转time.Time的坑

    这篇文章主要介绍了解决golang时间字符串转time.Time的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Go语言遍历目录的三种方法举例

    Go语言遍历目录的三种方法举例

    学习io之后,尤其是文件操作,我们就可以遍历给定的目录了,这篇文章主要给大家介绍了关于Go语言遍历目录的三种方法,分别是ioutil.ReadDir、filepath.Walk以及filepath.Glob,需要的朋友可以参考下
    2023-11-11
  • go proto编译引用外部包问题解决方案示例

    go proto编译引用外部包问题解决方案示例

    这篇文章主要为大家介绍了go proto编译引用外部包问题解决方案示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Go语言基础Json序列化反序列化及文件读写示例详解

    Go语言基础Json序列化反序列化及文件读写示例详解

    这篇文章主要为大家介绍了Go语言基础Json序列化反序列化以及文件读写的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-11-11
  • Go语言中defer语句的用法

    Go语言中defer语句的用法

    这篇文章介绍了Go语言中defer语句的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Go之interface的具体使用

    Go之interface的具体使用

    这篇文章主要介绍了Go之interface的具体使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • GoFrame gtree树形结构的使用技巧示例

    GoFrame gtree树形结构的使用技巧示例

    这篇文章主要为大家介绍了GoFrame gtree树形结构的使用技巧示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Go语言开发环境搭建与初探(Windows平台下)

    Go语言开发环境搭建与初探(Windows平台下)

    Go是Google开发的一种编译型,並發型,并具有垃圾回收功能的编程语言,可能很多人想学习go语言,那么首先就要了解go语言的环境配置方法
    2014-10-10

最新评论