一尘不染

如何让 Golang 程序打印它刚刚调用的错误的行号?

go

我试图在我的 Golang 程序中抛出错误,log.Fatal但是,log.Fatal也没有打印运行的行log.Fatal。有没有办法访问名为 log.Fatal 的行号?即有没有办法在抛出错误时获取行号?

我试图谷歌这个,但不确定如何。我能得到的最好的事情是打印堆栈跟踪,我想这很好,但可能有点太多了。我也不想debug.PrintStack()每次需要行号时都写,我只是很惊讶没有任何内置函数用于此之类的log.FatalStackTrace()或非服装的东西。

此外,我不想制作自己的调试/错误处理内容的原因是因为我不希望人们必须学习如何使用我的特殊服装处理代码。我只是想要一些标准的东西,人们可以稍后阅读我的代码并像

“啊好吧,所以它抛出一个错误并执行 X…”

了解我的代码的人越少越好:)


阅读 232

收藏
2021-11-26

共2个答案

一尘不染

您可以使用最小的学习曲线来实现它 runtime.Caller

func HandleError(err error) (b bool) {
    if err != nil {
        // notice that we're using 1, so it will actually log where
        // the error happened, 0 = this function, we don't want that.
        _, fn, line, _ := runtime.Caller(1)
        log.Printf("[error] %s:%d %v", fn, line, err)
        b = true
    }
    return
}

//this logs the function name as well.
func FancyHandleError(err error) (b bool) {
    if err != nil {
        // notice that we're using 1, so it will actually log the where
        // the error happened, 0 = this function, we don't want that.
        pc, fn, line, _ := runtime.Caller(1)

        log.Printf("[error] in %s[%s:%d] %v", runtime.FuncForPC(pc).Name(), fn, line, err)
        b = true
    }
    return
}

func main() {
    if FancyHandleError(fmt.Errorf("it's the end of the world")) {
        log.Print("stuff")
    }
}
2021-11-26
一尘不染

您可以在自定义 Logger 上设置标志,或者默认设置为包含LlongfileLshortfile

// to change the flags on the default logger
log.SetFlags(log.LstdFlags | log.Lshortfile)
2021-11-26