2 回答
TA貢獻1841條經(jīng)驗 獲得超3個贊
對字符串的類型斷言失敗,因為類型是其他類型。該類型是一個錯誤(它本身是一個保證 Error 方法的接口)。通常,如果需要,type switch 語句可以幫助代碼對不同的恢復(fù)響應(yīng)進行分類。這是一個中等長度的例子。請注意 runtime.Error 情況不是必需的,因為 runtime.Error 滿足錯誤。
func foo(fn func()) {
defer func() {
if e := recover(); e != nil {
switch e := e.(type) {
case string:
fmt.Println("recovered (string) panic:", e)
case runtime.Error:
fmt.Println("recovered (runtime.Error) panic:", e.Error())
case error:
fmt.Println("recovered (error) panic:", e.Error())
default:
fmt.Println("recovered (default) panic:", e)
}
fmt.Println(string(debug.Stack()))
return
}
fmt.Println("no panic recovered")
}()
fn()
}
TA貢獻1876條經(jīng)驗 獲得超6個贊
您不能使用類型斷言,因為errors.New(err.(string))字符串是不實現(xiàn)error接口的基礎(chǔ)類型。
所以如果你想抓住runtime.errorString恐慌。也許一種非正式的方式是使用反射,例如:
if reflect.TypeOf(err).String() == "*errors.errorString" {
// do something
}
- 2 回答
- 0 關(guān)注
- 193 瀏覽
添加回答
舉報
