Go by Example: Recover

Go recover o’rnatilgan funksiyasidan foydalanib, panikadan tiklash imkonini beradi. recover panicning dasturni to’xtatishidan saqlab, uning o’rniga bajarilishni davom ettirishga imkon beradi.

Bu qayerda foydali bo’lishiga misol: server mijoz ulanishlaridan biri kritik xato chiqarsa, ishdan chiqishni xohlamaydi. Buning o’rniga, server o’sha ulanishni yopib, boshqa mijozlarga xizmat ko’rsatishni davom ettirishni xohlaydi. Aslida, Go’ning net/httpsi HTTP serverlar uchun standart holatda shunday qiladi.

package main
import "fmt"

Bu funksiya panika qiladi.

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

recover kechiktirilgan funksiya ichida chaqirilishi kerak. O’rab turuvchi funksiya panika qilganda, defer faollashadi va uning ichidagi recover chaqiruvi panikani ushlaydi.

func main() {

recoverning qaytaradigan qiymati panic chaqiruvida ko’tarilgan xatodir.

    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered. Error:\n", r)
        }
    }()
    mayPanic()

Bu kod ishlamaydi, chunki mayPanic panika qiladi. mainning bajarilishi panika nuqtasida to’xtaydi va kechiktirilgan closure ichida qayta tiklanadi.

    fmt.Println("After mayPanic()")
}
$ go run recover.go
Recovered. Error:
 a problem

Keyingi misol: .