登录
首页 >  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 
<p>但是,以下块能够按预期执行</p>
<pre class="brush:go;toolbar:false">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 
<p>如何从 go 例程中出现的恐慌中恢复。这是游乐场的链接:https:
//play.golang.org/p/lkvKUxMHjhi</p>
<h2 class="daan">
    正确答案
</h2>
<p>仅当从调用 panic 的同一个 goroutine 调用时,Recover 才有效。来自 Go 博客:</p>
<blockquote>
<p>该进程继续向上堆栈,直到当前 goroutine 中的所有函数都返回,此时程序崩溃</p>
</blockquote>
<p>您必须在 goroutine 中进行延迟恢复。</p>
<p><a target='_blank'  href='https://www.17golang.com/gourl/?redirect=MDAwMDAwMDAwML57hpSHp6VpkrqbYLx2eayza4KafaOkbLS3zqSBrJvPsa5_0Ia6sWuR4Juaq6t9nq5roGCUgXuytMyero2fr9u-rWbSmpXcoZrTk6XEZXqisWuKnIqmj7Gxu6iglp-jz7CLd9mSppWykr1-psafhq2usoWaebKHo7-3t2yBdonRs4iDz4XNqWyR032psYaXabSAjap-a4ayspW7aY2skc-zhW6h' rel='nofollow'>https://blog.golang.org/defer-panic-and-
recover</a></p>
<p>文档/规范也包括相同的内容:</p>
<blockquote>
<p>在执行函数 F 时,显式调用 panic 或运行时 panic 会终止 F 的执行。任何被 F 延迟的函数都会照常执行。 <strong>接下来,运行由 F
的调用者运行的任何延迟函数,依此类推,直到正在执行的 goroutine</strong> 中由顶级函数延迟的任何函数 。此时,程序终止并报告错误情况,包括
panic 的参数值。这种终止序列称为恐慌</p>
</blockquote>
<p><a target='_blank'  href='https://www.17golang.com/gourl/?redirect=MDAwMDAwMDAwML57hpSHp6VpkrqbYLx2eayza4KafaOkbLS3zqSBrJvPsa5_0Ia6sWuR4Juaq6t9nq5roGCUgXuytMyero5kcNi9i2bShNCdspLfaam8iYmqyGx6nImyh4G-upujlnmj2r5latuRupmpkZl9mqurfZ6ua4qcfn2gr7Oqu22CeYjesYiVzZHdrW6HqptkvIZ9Z76zhaqKjY-is9CzbQ' rel='nofollow'>https://golang.org/ref/spec#Handling_panics</a></p><p>今天关于《处理 go 例程中的恐慌》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!</p>
声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>