为了账号安全,请及时绑定邮箱和手机立即绑定

恐慌并从包中恢复

恐慌并从包中恢复

Go
SMILET 2021-08-16 20:12:49
我试图弄清楚如何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:

  • 恢复不是由延迟函数直接调用的。

我最近被这个问题抓住了。因为规范非常简洁,所以有时需要仔细阅读才能挑出一些要点。


查看完整回答
反对 回复 2021-08-16
?
小唯快跑啊

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,你没有抓住恐慌。


查看完整回答
反对 回复 2021-08-16
  • 2 回答
  • 0 关注
  • 197 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信