简体   繁体   中英

PANIC in default formatting with Go's log package

When logging in Go with log.Println , I frequently get

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

I'm not sure how to determine what I've done wrong, I assume that somewhere fmt.Println has caught a panic generated by one of my own Stringer interface implementations, so as not to crash my program due to logging failure.

How do I work out what's going on? Why am I getting this erroneous message?

You are right, there is a panic in a String method. But it has nothing to do with the log package. Println uses %v , and %v means running String method. Having a panic in the String method invokes catchPanic . Here in your output 3 is the value of your panic.

W/o the code to inspect it's hard to say. To debug it, perhaps try replacing log.Println("evaluating", foo) with log.Printf("evaluating %#v\\n", foo) . It works a bit differently:

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
$ 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM