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方法返回调用栈信息

参考资料:

errors返回堆栈信息 https://blog.csdn.net/EDDYCJY/article/details/134890000

你可能感兴趣的:(golang,golang,后端)