Go в примери: Възстановяване

В Го имаме възможност да възстановим програмата след като е изпаднала в ужас като ползваме вградената функция recover (възстановявам (се))1. Извикването на recover може да спре действието на panic – спиране на програмата – и така да продължим изпълнението ѝ.


  1. Вижте https://go.dev/blog/defer-panic-and-recover

Ето пример как това може да ни бъде от полза: един сървър не би спрял ако някоя от връзките с клиенти прекъсне с критична грешка. Вместо това сървърът ще затвори връзката и ще продължи да обслужва други клиентски програми. Всъщност това и прави пакетът net/http, предназна`ен за създаване на уеб сървъри.

package main
import "fmt"

Тази функция ужасява програмата.

func можеДаУжаси() {
    panic(struct{ a int }{a: 2})
}

recover трябва да се извика в отложена функция. Когато обгръщащата я функция се ужаси defer ще се задейства а извиканата в нея recover ще прехване ужаса.

func main() {

Стойността, която recover връща е каквото е подадено на panic.

    defer func() {
        if r := recover(); r != nil {
            fmt.Printf("Възстановено. Грешка: [%v]\n", r)
        }
    }()
    можеДаУжаси()

Този код няма да се изпълни, защото mayPanic ужасява. Изпълнението на main спира в точката на на извикване на panic и продължава в отложеното затваряне.

    fmt.Println("След можеДаУжаси()")
}
$ go run recover.go
Възстановено. Грешка: [{2}]

Следващ пример: .