回答

收藏

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

技术问答 技术问答 209 人阅读 | 0 人回复 | 2023-09-12

我试着在我的 Golang 在程序中出错,log.Fatal但是,log.Fatal没有打印行log.Fatal。有没有办法访名叫  log.Fatal 行号?也就是说,抛错时有没有办法获得行号?# g: B9 C2 e$ S& R
我试图谷歌,但我不确定。我能得到的最好的是打印堆栈跟踪。我觉得很好,但可能有点太多了。debug.PrintStack()每次需要行号时都写,我只是很惊讶没有任何内置函数用于此之类的log.FatalStackTrace()或非服装的东西。
1 l' b% \' B; a此外,我之所以不想制作自己的调试/错误处理内容,是因为我不想让人们学习如何使用我的特殊服装处理代码。我只是想要一些标准的东西。人们以后可以读我的代码,就像, @7 _3 l7 Y# P/ Y# y) d
好吧,所以它抛出错误并执行 X…”4 C- V/ q0 g- S: I! m  {* M% q' q
了解我代码的人越少越好" x& Z1 J# O; e5 ~' |2 K
                                                               
) s# n1 D9 _7 D    解决方案:                                                               
  r( U; \/ @! N                                                                你可以用最小的学习曲线来实现它 runtime.Caller
, P5 F( E; a$ u, O[code]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")  code]
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则