在 Go 中,異常情況通常使用錯誤值來處理,錯誤值實現了錯誤介面。介面的 Error() 方法傳回描述錯誤的字串。
但是,在處理自訂錯誤類型時,必須避免在 Error() 方法中出現遞迴。
考慮一個自訂錯誤類型,其中 Error() 方法呼叫 fmt.Sprint(e) 將錯誤值轉換為字串。這種方法會帶來一個潛在的問題:
type MyError struct { message string } func (e MyError) Error() string { return fmt.Sprint(e) }
如果您現在嘗試列印錯誤,則會發生無限循環:
func main() { err := MyError{"Error!"} fmt.Println(err) }
發生這種情況是因為fmt. Sprint(e) 呼叫e .Error(),然後再呼叫fmt.Sprint(e),依此類推。
要打破遞歸,請將e 轉換為沒有String 或Error 方法的值,然後再將其傳遞給fmt.Sprint:
func main() { err := MyError{"Error!"} fmt.Println(fmt.Sprint(float64(err))) }
在此範例中,將e 轉換為float64 刪除其String 和Error 方法,防止無限迴圈。
以上是Go中處理自訂錯誤時如何防止無限循環?的詳細內容。更多資訊請關注PHP中文網其他相關文章!