恢復

顧名思義,可以嘗試從 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