我试图弄清楚如何panic()和recover()工作..日志包package logimport ( "fmt")func Recover() { fmt.Println("Recovering!") if err := recover(); err != nil { fmt.Println("Error message recovered!") }}主包package mainimport ( "fmt" log "www/pkg/log")func main() { defer func() { log.Recover() }() panic("Fake error!")}输出Recovering!panic: Fake error!为什么Error message recovered!从不打印?
2 回答
九州编程
TA贡献1785条经验 获得超4个赞
应用程序必须直接从延迟函数调用恢复来处理恐慌。
该规范对递延函数调用会谈恢复:
假设一个函数 G 推迟了一个调用恢复的函数 D,并且在 G 正在执行的同一个 goroutine 上的一个函数中发生了恐慌。当 deferred 函数的运行达到 D 时,D 调用 recovery 的返回值将是传递给调用 panic 的值。
这很微妙,但它不允许间接调用来恢复。此外,关于recover返回值的段落提到了来自延迟函数的直接调用:
如果满足以下任一条件,recover 的返回值为 nil:
恢复不是由延迟函数直接调用的。
我最近被这个问题抓住了。因为规范非常简洁,所以有时需要仔细阅读才能挑出一些要点。
小唯快跑啊
TA贡献1863条经验 获得超2个赞
revocer
仅指当前 goroutine 的执行:文档说:
Executing a call to recover inside a deferred function **(but not any function called by it)** stops the panicking sequence by restoring normal execution
当你调用另一个函数时,它没有恐慌,因此在它中间调用恢复返回 nil,你没有抓住恐慌。
- 2 回答
- 0 关注
- 197 浏览
添加回答
举报
0/150
提交
取消