我怎样才能在 recover() 中捕获 runtime.errorString?

我试着抓住恐慌


func test(/*some input*/) (output string,err111 error) {

    defer func(){

        if err := recover(); err != nil {

            output = ""

            err111 = errors.New(err.(string))

        }

    }()

    ....

}

但是 goroutine 告诉我


interface conversion: interface {} is runtime.errorString, not string

如何转储 recover() 错误并将其返回?


吃鸡游戏
浏览 144回答 2
2回答

偶然的你

对字符串的类型断言失败,因为类型是其他类型。该类型是一个错误(它本身是一个保证 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()}

HUX布斯

您不能使用类型断言,因为errors.New(err.(string))字符串是不实现error接口的基础类型。所以如果你想抓住runtime.errorString恐慌。也许一种非正式的方式是使用反射,例如:if reflect.TypeOf(err).String() == "*errors.errorString" {    // do something}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go