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操作redis与redigo的示例解析

    Go操作redis与redigo的示例解析

    这篇文章主要为大家介绍了Go操作redis与redigo的示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • 聊聊go xorm生成mysql的结构体问题

    聊聊go xorm生成mysql的结构体问题

    这篇文章主要介绍了go xorm生成mysql的结构体问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-03-03
  • Go语言使用Cobra实现强大命令行应用

    Go语言使用Cobra实现强大命令行应用

    Cobra是一个强大的开源工具,能够帮助我们快速构建出优雅且功能丰富的命令行应用,本文为大家介绍了如何使用Cobra打造强大命令行应用,感兴趣的小伙伴可以了解一下
    2023-07-07
  • go实现脚本解释器gscript

    go实现脚本解释器gscript

    这篇文章主要为大家介绍了go实现脚本解释器gscript示例代码,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 解决golang gin框架跨域及注解的问题

    解决golang gin框架跨域及注解的问题

    这篇文章主要介绍了解决golang gin框架跨域及注解的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • go语言base64加密解密的方法

    go语言base64加密解密的方法

    这篇文章主要介绍了go语言base64加密解密的方法,实例分析了Go语言base64加密解密的技巧,需要的朋友可以参考下
    2015-03-03
  • Go语言sync.Map详解及使用场景

    Go语言sync.Map详解及使用场景

    Go语言中的sync.Map是一个高效的并发安全映射结构,适用于高并发读多写少的场景,它通过读写分离、无锁读取路径、写入时的锁保护等机制,提高了读取性能并减少了锁竞争,sync.Map不需要手动管理锁,降低了编程复杂性,适合需要简单并发访问的场合
    2024-10-10
  • golang优化目录遍历的实现方法

    golang优化目录遍历的实现方法

    对于go1.16的新变化,大家印象最深的可能是io包的大规模重构,但这个重构实际上还引进了一个优化,这篇文章要说的就是这个优化,所以本将给大家介绍golang是如何优化目录遍历的,需要的朋友可以参考下
    2024-08-08
  • Golang内存泄漏场景以及解决方案详析

    Golang内存泄漏场景以及解决方案详析

    golang中内存泄露的发现与排查一直是来是go开发者头疼的一件事,下面这篇文章主要给大家介绍了关于Golang内存泄漏场景以及解决的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • Go语言中基本数据类型的相互转换详解

    Go语言中基本数据类型的相互转换详解

    Go在不同类型的变量之间赋值时需要显示转换,不能自动转换。这篇文章主要和大家介绍了Go语言中基本数据类型的相互转换,感兴趣的小伙伴可以了解一下
    2022-10-10

最新评论