2012-05-13 61 views
1

當轉到與log.Println記錄,我經常得到恐慌默認格式與Go的日誌包

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

我不知道如何確定什麼,我做錯了,我認爲地方fmt.Println已經趕上由我自己的Stringer接口實現之一產生的恐慌,以免因記錄失敗而導致我的程序崩潰。

如何解決發生了什麼?爲什麼我收到這個錯誤的信息?

回答

3

你說得對,有一個String方法的恐慌。但它與log包沒有任何關係。 Println使用%v%v意味着運行String方法。在String方法中發生恐慌時調用catchPanic。這裏在你的輸出3是你的恐慌的價值。

+0

乾杯。如果連接了調試器,那麼在引發恐慌時這個過程會中斷,並且正如您所描述的那樣。 –

1

沒有代碼來檢查它很難說。要調試它,可能試着用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 
$