登录
首页 >  Golang >  Go问答

处理 go 例程中的恐慌

来源:Golang技术栈

时间:2023-03-20 19:28:31 383浏览 收藏

哈喽!大家好,很高兴又见面了,我是golang学习网的一名作者,今天由我给大家带来一篇《处理 go 例程中的恐慌》,本文主要会讲到golang等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面就一起来看看吧!

问题内容

我知道使用了处理恐慌恢复。但是当 goroutine 中出现恐慌时,以下块无法恢复

func main() {
    done := make(chan int64)
    defer fmt.Println("Graceful End of program")
    defer func() {
     r := recover()
     if _, ok := r.(error); ok {
        fmt.Println("Recovered")
     }
    }()

    go handle(done)
    for {
        select{
        case 

但是,以下块能够按预期执行

func main() {
    done := make(chan int64)
    defer fmt.Println("Graceful End of program")
    defer func() {
     r := recover()
     if _, ok := r.(error); ok {
        fmt.Println("Recovered")
     }
    }()

    handle(done)
    for {
        select{
        case 

如何从 go 例程中出现的恐慌中恢复。这是游乐场的链接:https: //play.golang.org/p/lkvKUxMHjhi

正确答案

仅当从调用 panic 的同一个 goroutine 调用时,Recover 才有效。来自 Go 博客:

该进程继续向上堆栈,直到当前 goroutine 中的所有函数都返回,此时程序崩溃

您必须在 goroutine 中进行延迟恢复。

https://blog.golang.org/defer-panic-and- recover

文档/规范也包括相同的内容:

在执行函数 F 时,显式调用 panic 或运行时 panic 会终止 F 的执行。任何被 F 延迟的函数都会照常执行。 接下来,运行由 F 的调用者运行的任何延迟函数,依此类推,直到正在执行的 goroutine 中由顶级函数延迟的任何函数 。此时,程序终止并报告错误情况,包括 panic 的参数值。这种终止序列称为恐慌

https://golang.org/ref/spec#Handling_panics

今天关于《处理 go 例程中的恐慌》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>