Go на примерах: Восстановление (recover)

Go позволяет восстановиться после паники с помощью встроенной функции recover. recover может остановить panic и позволить программе продолжить выполнение.

Пример полезного применения: сервер не должен падать, если одно из клиентских соединений вызывает критическую ошибку. Вместо этого сервер должен закрыть это соединение и продолжить обслуживать других клиентов. Именно так по умолчанию работает net/http в Go для HTTP-серверов.

package main
import "fmt"

Эта функция вызывает panic.

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

recover должен вызываться внутри отложенной функции. Когда охватывающая функция паникует, defer активируется, и вызов 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

Далее: .