使用Go的日志包进行默认格式化的PANIC

时间:2012-05-13 08:51:50

标签: logging formatting go

使用log.Println登录Go时,我经常会

2012/05/13 16:45:50 evaluating %v(PANIC=3)

我不确定如何确定我做错了什么,我假设某个地方fmt.Println已经抓住了我自己的Stringer接口实现之一产生的恐慌,以免崩溃我的程序由于记录失败。

我如何计算出正在发生的事情?为什么我收到这条错误信息?

2 个答案:

答案 0 :(得分:3)

你是对的,String方法存在恐慌。但它与log包无关。 Println使用%v%v表示运行String方法。在String方法中发生混乱会调用catchPanic。输出中3就是恐慌的价值。

答案 1 :(得分:1)

没有用于检查它的代码很难说。要对其进行调试,可以尝试将log.Println("evaluating", foo)替换为log.Printf("evaluating %#v\n", foo)。它的工作方式有点不同:

package main

import "log"

type t int

func (t) String() string {
    panic(3)
}

func main() {
    var v t = 42
    log.Println("evaluating", v)
    log.Printf("evaluating %#v\n", v)
}

$ go run main.go
2012/05/13 11:19:49 evaluating %v(PANIC=3)
2012/05/13 11:19:49 evaluating 42
$