2 回答
TA贡献1841条经验 获得超3个赞
对字符串的类型断言失败,因为类型是其他类型。该类型是一个错误(它本身是一个保证 Error 方法的接口)。通常,如果需要,type switch 语句可以帮助代码对不同的恢复响应进行分类。这是一个中等长度的例子。请注意 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条经验 获得超6个赞
您不能使用类型断言,因为errors.New(err.(string))字符串是不实现error接口的基础类型。
所以如果你想抓住runtime.errorString恐慌。也许一种非正式的方式是使用反射,例如:
if reflect.TypeOf(err).String() == "*errors.errorString" {
// do something
}
- 2 回答
- 0 关注
- 143 浏览
添加回答
举报