你如何得到一个Golang程序来打印刚才调用的错误的行号?

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

我试图谷歌这一点,但不确定如何。 我能得到的最好的东西是打印堆栈跟踪 ,我认为这很好,但可能会有点太多。 我也不想编写debug.PrintStack()每次我需要行号,我只是感到奇怪,没有任何内置函数为这个像log.FatalStackTrace()或不是服装的东西。

另外,我不想做自己的debugging/error handling的原因是因为我不想让人们学习如何使用我的特殊服装处理代码。 我只是想要一些标准,以便人们可以稍后阅读我的代码,并像

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

越less的人必须了解我的代码越好:)

您可以在自定义logging器上设置标志,或者将缺省设置为包含LlongfileLshortfile

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

简洁版本, 没有直接内置的东西 ,但是您可以使用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") } } 

操场