我试图惊慌
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()错误并返回它?
答案 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