當轉到與log.Println
記錄,我經常得到恐慌默認格式與Go的日誌包
2012/05/13 16:45:50 evaluating %v(PANIC=3)
我不知道如何確定什麼,我做錯了,我認爲地方fmt.Println
已經趕上由我自己的Stringer
接口實現之一產生的恐慌,以免因記錄失敗而導致我的程序崩潰。
如何解決發生了什麼?爲什麼我收到這個錯誤的信息?
當轉到與log.Println
記錄,我經常得到恐慌默認格式與Go的日誌包
2012/05/13 16:45:50 evaluating %v(PANIC=3)
我不知道如何確定什麼,我做錯了,我認爲地方fmt.Println
已經趕上由我自己的Stringer
接口實現之一產生的恐慌,以免因記錄失敗而導致我的程序崩潰。
如何解決發生了什麼?爲什麼我收到這個錯誤的信息?
你說得對,有一個String
方法的恐慌。但它與log
包沒有任何關係。 Println
使用%v
和%v
意味着運行String
方法。在String
方法中發生恐慌時調用catchPanic
。這裏在你的輸出3
是你的恐慌的價值。
沒有代碼來檢查它很難說。要調試它,可能試着用log.Printf("evaluating %#v\n", foo)
替換log.Println("evaluating", 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
$
乾杯。如果連接了調試器,那麼在引發恐慌時這個過程會中斷,並且正如您所描述的那樣。 –