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).
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.
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
$ go run main.go
Kodingizni ishga tushiring