恢复

顾名思义,可以尝试从 panic 中恢复。必须在延迟语句中尝试恢复,因为正常执行流已经停止。recover 语句必须直接出现在延迟函数框中。在延迟函数调用调用的函数中的恢复语句将不受支持。如果程序当前恐慌,recover() 调用将返回提供给初始恐慌的参数。如果该程序目前没有恐慌,recover() 将返回 nil

package main

import "fmt"

func foo() {
    panic("bar")
}

func bar() {
    defer func() {
        if msg := recover(); msg != nil {
            fmt.Printf("Recovered with message %s\n", msg)
        }
    }()
    foo()
    fmt.Println("Never gets executed")
}

func main() {
    fmt.Println("Entering main")
    bar()
    fmt.Println("Exiting main the normal way")
}

输出:

Entering main
Recovered with message bar
Exiting main the normal way