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

时间:2018-08-18 04:11:48

标签: go built-in panic

我试图惊慌

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

我该如何转储recovery()错误并返回它?

2 个答案:

答案 0 :(得分:1)

对字符串的类型声明失败,因为类型是其他类型。类型是一个错误(它本身是保证Error方法的接口)。通常,如果需要的话,类型切换语句可以帮助代码对不同的恢复响应进行分类。这是一个中等长度的例子。请注意,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()

}

答案 1 :(得分:0)

您不能使用 SELECT a1.id,a1.letter_id,a1.action_date FROM action a1 JOIN (SELECT a.letter_id,max(a.action_date) as mdate FROM action a GROUP BY a.letter_id) a2 ON a1.letter_id=a2.letter_id AND a1.action_date=a2.mdate 之类的类型断言,因为cuz字符串是不实现errors.New(err.(string))接口的基础类型。

因此,如果您想引起error的恐慌。也许是一种非正式的方式,例如使用反射:

runtime.errorString