首页 > 解决方案 > 从恐慌中恢复的程序未按预期退出

问题描述

据我了解,当恐慌恢复时,我希望程序退出并表现出正常行为,但事实并非如此。我期望最后一行打印“程序结束”是否正确?如果出现运行时错误,它不会被打印,是吗?

package main

import (
    "fmt"
)

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Printf("Cause of panic ==>>, %q\n", r)
        }
    }()
    f(3)
    fmt.Println("End of program")
}

func f(x int) {
    fmt.Printf("f(%d) is called.\n", x) //panic triggered when x==0
    // defer called in reverse order in case of panic
    defer fmt.Printf("defer %d\n", x+0/x)

    f(x-1)
}

标签: go

解决方案


不会打印“程序结束”。

当检测到恐慌时,导致恐慌的函数立即返回,以及调用该函数的函数等,一直到调用的函数recover。当该函数返回并恢复时,程序会继续运行,就好像没有发生恐慌一样。

在您的情况下,main是恢复的功能。恐慌在f(3)调用时触发,并且在 main 返回后进行恢复,绕过 println。


推荐阅读