2 回答

TA貢獻(xiàn)1841條經(jīng)驗(yàn) 獲得超3個(gè)贊
對(duì)字符串的類型斷言失敗,因?yàn)轭愋褪瞧渌愋?。該類型是一個(gè)錯(cuò)誤(它本身是一個(gè)保證 Error 方法的接口)。通常,如果需要,type switch 語句可以幫助代碼對(duì)不同的恢復(fù)響應(yīng)進(jìn)行分類。這是一個(gè)中等長度的例子。請(qǐng)注意 runtime.Error 情況不是必需的,因?yàn)?runtime.Error 滿足錯(cuò)誤。
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貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超6個(gè)贊
您不能使用類型斷言,因?yàn)閑rrors.New(err.(string))字符串是不實(shí)現(xiàn)error接口的基礎(chǔ)類型。
所以如果你想抓住runtime.errorString恐慌。也許一種非正式的方式是使用反射,例如:
if reflect.TypeOf(err).String() == "*errors.errorString" {
// do something
}
- 2 回答
- 0 關(guān)注
- 177 瀏覽
添加回答
舉報(bào)