2014-09-27 52 views
1

如何從錯誤界面中獲取錯誤字符串?從錯誤界面中獲取錯誤字符串

我要分配ERROR: Fake error!給一個變量,然後將其轉換成片[]byte(error_str)

prefix_err := "ERROR: " 

defer func() { 
    if err := recover(); err != nil { 
     // get error message from "err" as string 
    } 
}() 

panic("Fake error!") 
+1

出於好奇,爲什麼你需要'[]字節'的錯誤?我唯一的猜測就是你想把它寫入一個文件,'io.Writer'需要一個'[]字節'。如果是這樣,有更簡單的接口可以接受字符串。 – LinearZoetrope 2014-09-27 20:09:37

+0

你是什麼意思?是的,我正在寫'os.Stderr'和一個文件 – clarkk 2014-09-27 20:16:48

+1

使用'fmt.Fprint [ln | f](io.Stderr,「我的字符串」)'事實上,你可以用'fmt.Fprintf (io.Stderr,「%s%v \ n」,prefix_err,err)' – LinearZoetrope 2014-09-27 20:18:25

回答

3

這裏有兩個不同的問題:

第一個問題:實際error類型實際上是一個內置-in界面。爲了實現它,你需要實現一個類型爲func Error() string的方法。所以error類型的任何東西都可以通過調用它的Error函數轉換爲字符串格式。

第二個問題:panic不參加error,它需要interface{}。內建的recover類似地返回您傳遞給panic的任何interface{}。在這種情況下,撥打Error將不起作用。事實上,你沒有通過errorpanic,你通過了string(這很常見)。

有很多方法可以從interface{}獲得string,而大型開關是一個。但總體來說,我認爲最簡單的選擇是

myBytes := []byte(fmt.Sprintf("%s%v", prefix_err, err)) 

這將永遠得到任何接口的字符串表示{}是,呼籲String()或必要Error(),然後將其轉換成[]byte

(小腳註:它不被認爲是在變量名中使用下劃線的Go風格,而是使用camelCase代替)。

編輯:

既然事實證明我們有一個部分的「X Y問題」與轉換爲[]byte寫爲io.Writer。如果您想將此日誌記錄到Stderr,則可以使用fmt.Fprintf(os.Stderr, "%s%v\n", prefix_err, err)甚至fmt.Fprintln(os.Stderr, prefix_err, err)。任何Fprint將正確打印到任何io.Writer,包括日誌文件。

0

恐慌並不總是採取錯誤的類型。在你的情況下,你傳遞一個字符串。

panic("Fake Error") 

err := recover() // => string (interface) 

到了錯誤的接口上恢復,你需要傳遞一個錯誤

panic(fmt.Errorf("Fake Error!")) 

err := recover() // => error (interface) 
e := err.(error) // type check 
e.Error()  // => string 

如果你不能肯定你會得到哪一個,你可以輸入查詢時,您恢復並相應地處理。