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

Work in Progress / Сайт в процесі розробки

Фукнція 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, і єдиний шлях зробити це є використання відкладення виклику функції що буде перевіряти чи потрібно функції робитит відновлення.

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