go 中recover捕获异常 - Go语言中文社区

go 中recover捕获异常


recover 仅在延迟函数 defer 中有效,在正常的执行过程中,调用 recover 会返回 nil 并且没有其他任何效果.
重要的事再说一遍:仅当在一个defer函数中被完成时,调用recover()才生效。

我们来一段错误的代码:

package main

import "fmt"

func main() {
    recover() // 无任何作用
    panic("停止运行")
    recover() // 不会执行到
    fmt.Println("结束")
}

输出:

panic: 停止运行

goroutine 1 [running]:exit status 2

修改下,正确的代码:

package main

import "fmt"

func main() {
    defer func() {
        fmt.Println("捕获到异常:", recover())
    }()
    panic("手动抛出异常")
}

输出:

捕获到异常: 手动抛出异常

重要的事再说一遍:recover()的调用仅当它在defer函数中被直接调用时才有效。

继续来看一段错误的代码:

package main

import "fmt"

func doRecover() {
    fmt.Println("捕获到异常 =>", recover()) //输出: 捕获到异常 => <nil>
}
func main() {
    defer func() {
        doRecover() //注意:这里间接使用函数,在函数中调用了recover()函数,
        // panic 没有恢复,没有捕获到错误信息
    }()
    panic("手动抛出异常")
}

输出:

捕获到异常 => <nil>
panic: 手动抛出异常
goroutine 1 [running]:
main.main()
exit status 2

总结:panic配合recover使用,recover要在defer函数中直接调用才生效。

版权声明:本文来源博客园,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://www.cnblogs.com/phpper/p/12059701.html
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-01-06 20:46:00
  • 阅读 ( 1388 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢