透過範例學習 Go 語言:修復

透過使用內建函式 `recover`,Go 程式設計語言能從驚恐狀況中復原。`recover` 能夠防止 `panic` 中止程式執行,並讓程式繼續執行。

一個實用的範例:假設有一個伺服器,當其中一個用戶端連線發生重大錯誤時,伺服器不應該崩潰。相反地,伺服器會關閉該連線並持續服務其他用戶端。事實上,這是 Go 的 `net/http` 預設用於 HTTP 伺服器的做法。

package main
import "fmt"

這個函式會引發驚恐狀況。

func mayPanic() {
    panic("a problem")
}

必須在遞延函式中呼叫 `recover`。當封閉的函式引發驚恐狀況時,遞延會啟用,並且函式中的 `recover` 呼叫將會擷取到驚恐狀況。

func main() {

`recover` 的回傳值是 `panic` 呼叫中引發的錯誤。

    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered. Error:\n", r)
        }
    }()
    mayPanic()

這段程式碼不會執行,因為 `mayPanic` 會引發驚恐狀況。`main` 的執行會在引發驚恐狀況時停止,並在遞延閉包中繼續執行。

    fmt.Println("After mayPanic()")
}
$ go run recover.go
Recovered. Error:
 a problem

下一個範例:字串函式