透過使用內建函式 `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()")
}
|