Go за Прикладом: Відновлення (Recover)

Функція recover (або відновлення) використовується лише в парі з defer, її призначення перехоплювати panic та відновлювати потік виконання програми.

package main
import "fmt"

Основна мета цієї функції - викликати паніку.

func errorFunc() {
    panic("Паніка без причини")
}

Паніка буде викликана в цій функції, і наша ціль перехопити панічний стан та спокійно завершити роботу.

func normalFunc() {

Перехоплення panic‘и та recover відбувається за допомогою відкладеного виклику, який, як ви вже знаєте, відбувається по завершенню виконання функції.

    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Опрацювання паніки:", r)
        }
    }()

Момент panic‘и програми.

    errorFunc()

Цей рядок ніколи не буде надруковано.

    fmt.Println("Нормальний вихід")
}
func main() {
    normalFunc()
    fmt.Println("Повернення з функції normalFunc.")
}

Запуск програми покаже - як вона опрацювала сигнал panic‘и та відновала свою роботу.

$ go run recover.go
Опрацювання паніки: Паніка без причини
Повернення з функції normalFunc.

Власне panic‘а була перехоплена в момент її переходу на вище в main, але в фукнції в якій було викликано паніку - було налаштовано відкладений виклик на перехоплюваня будь якої паніки та спокійне завершення роботи.

Наступний приклад: Функцій для роботи з колекціями.