GoDasturchi
Panic and Recover

Panic and Recover

Panic va recover

Real-World Patterns kursida siz panic/recoverni HTTP middleware kontekstida ko'rgansiz. Endi ularni til darajasida, batafsilroq o'rganamiz. `panic` — dasturning normal bajarilishini to'xtatib, darhol funksiyalar zanjiri bo'ylab "yuqoriga ko'tarilishni" boshlaydigan mexanizm (nol'ga bo'lish, nil pointer'ga murojaat, yoki panic("xabar") orqali qo'lda chaqirilishi mumkin).

example.go
func SafeDivide(a, b int) (result int, err error) {
    defer func() {
        if r := recover(); r != nil {
            err = fmt.Errorf("recovered from panic: %v", r)
        }
    }()
    result = a / b
    return result, nil
}

recover() faqat defer ichida chaqirilganda ma'noga ega — u joriy panic'ni "ushlab", uning qiymatini qaytaradi va dasturning yiqilishini to'xtatadi (panic bo'lmasa, recover() shunchaki nil qaytaradi). Bu yerda muhim naqsh: err — nomlangan qaytish qiymati, shuning uchun defer ichida uni o'zgartirish funksiyaning haqiqiy qaytadigan xatosiga ta'sir qiladi — Named Return Values darsidagi g'oyaning kuchli qo'llanilishi.

>_ Exercise

SafeDivide(a, b int) (result int, err error) funksiyasini yozing. U defer va recover() yordamida a / b bajarilishida yuzaga kelishi mumkin bo'lgan panic'ni (nolga bo'lish) ushlab, uni "recovered from panic: <xabar>" shaklidagi xatoga aylantiradi.

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

recover() faqat defer ichida ishlaydi va joriy panic'ni ushlab, uning qiymatini qaytaradi. Nomlangan qaytish qiymati bilan birlashtirilganda, bu panic'ni oddiy error qiymatiga aylantirish imkonini beradi — dastur yiqilmasdan davom etadi.

NEXT UP

Stack Traces and Debugging

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Panic and Recover

Panic va recover

Real-World Patterns kursida siz panic/recoverni HTTP middleware kontekstida ko'rgansiz. Endi ularni til darajasida, batafsilroq o'rganamiz. `panic` — dasturning normal bajarilishini to'xtatib, darhol funksiyalar zanjiri bo'ylab "yuqoriga ko'tarilishni" boshlaydigan mexanizm (nol'ga bo'lish, nil pointer'ga murojaat, yoki panic("xabar") orqali qo'lda chaqirilishi mumkin).

example.go
func SafeDivide(a, b int) (result int, err error) {
    defer func() {
        if r := recover(); r != nil {
            err = fmt.Errorf("recovered from panic: %v", r)
        }
    }()
    result = a / b
    return result, nil
}

recover() faqat defer ichida chaqirilganda ma'noga ega — u joriy panic'ni "ushlab", uning qiymatini qaytaradi va dasturning yiqilishini to'xtatadi (panic bo'lmasa, recover() shunchaki nil qaytaradi). Bu yerda muhim naqsh: err — nomlangan qaytish qiymati, shuning uchun defer ichida uni o'zgartirish funksiyaning haqiqiy qaytadigan xatosiga ta'sir qiladi — Named Return Values darsidagi g'oyaning kuchli qo'llanilishi.

>_ Exercise

SafeDivide(a, b int) (result int, err error) funksiyasini yozing. U defer va recover() yordamida a / b bajarilishida yuzaga kelishi mumkin bo'lgan panic'ni (nolga bo'lish) ushlab, uni "recovered from panic: <xabar>" shaklidagi xatoga aylantiradi.

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

recover() faqat defer ichida ishlaydi va joriy panic'ni ushlab, uning qiymatini qaytaradi. Nomlangan qaytish qiymati bilan birlashtirilganda, bu panic'ni oddiy error qiymatiga aylantirish imkonini beradi — dastur yiqilmasdan davom etadi.

NEXT UP

Stack Traces and Debugging