GoDasturchi
Don't Panic in Libraries

Don't Panic in Libraries

Kutubxonalarda panic ishlatmang

panic — Go'da "favqulodda holat", dasturni darhol to'xtatadi. Qoidasi: kutubxona kodi (boshqalar chaqiradigan funksiyalar) panic chaqirmasligi, buning o'rniga har doim error qaytarishi kerak.

example.go
package main

import (
	"errors"
	"fmt"
)

// Yomon: kutubxona funksiyasi panic qiladi — chaqiruvchiga tanlov qoldirmaydi
func divideOldBad(a, b int) int {
	if b == 0 {
		panic("nolga bo'lish mumkin emas")
	}
	return a / b
}

// Yaxshi: xatoni qaytaradi, chaqiruvchi o'zi qaror qiladi
func divide(a, b int) (int, error) {
	if b == 0 {
		return 0, errors.New("nolga bo'lish mumkin emas")
	}
	return a / b, nil
}

func main() {
	result, err := divide(10, 0)
	if err != nil {
		fmt.Println("xato:", err)
		return
	}
	fmt.Println(result)
}

Nega bu muhim? panic chaqiruvchiga hech qanday tanlov qoldirmaydi — dastur to'xtaydi (agar kimdir recover() bilan ushlab qolmasa). error qaytarilsa esa, chaqiruvchi o'zi qaror qiladi: xatoni ko'rsatishmi, standart qiymat ishlatishmi, qayta urinib ko'rishmi. panic faqat haqiqatan tiklab bo'lmaydigan holatlar uchun qoldiriladi — masalan dastur ishga tushishida noto'g'ri sozlangan konfiguratsiya (log.Fatalga o'xshab).

>_ Exercise

panic o'rniga error qaytaring.

  • safeSqrt(n float64) (float64, error) yozing: n manfiy bo'lsa xato qaytarsin (panic emas)
  • math.Sqrt bilan natijani hisoblang
  • ikkita holat (musbat va manfiy) uchun chaqirib natijalarni chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Kutubxona kodi panic emas, error qaytarishi kerak — bu chaqiruvchiga vaziyatni o'zi hal qilish imkonini beradi.

NEXT UP

Error Message Style

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Don't Panic in Libraries

Kutubxonalarda panic ishlatmang

panic — Go'da "favqulodda holat", dasturni darhol to'xtatadi. Qoidasi: kutubxona kodi (boshqalar chaqiradigan funksiyalar) panic chaqirmasligi, buning o'rniga har doim error qaytarishi kerak.

example.go
package main

import (
	"errors"
	"fmt"
)

// Yomon: kutubxona funksiyasi panic qiladi — chaqiruvchiga tanlov qoldirmaydi
func divideOldBad(a, b int) int {
	if b == 0 {
		panic("nolga bo'lish mumkin emas")
	}
	return a / b
}

// Yaxshi: xatoni qaytaradi, chaqiruvchi o'zi qaror qiladi
func divide(a, b int) (int, error) {
	if b == 0 {
		return 0, errors.New("nolga bo'lish mumkin emas")
	}
	return a / b, nil
}

func main() {
	result, err := divide(10, 0)
	if err != nil {
		fmt.Println("xato:", err)
		return
	}
	fmt.Println(result)
}

Nega bu muhim? panic chaqiruvchiga hech qanday tanlov qoldirmaydi — dastur to'xtaydi (agar kimdir recover() bilan ushlab qolmasa). error qaytarilsa esa, chaqiruvchi o'zi qaror qiladi: xatoni ko'rsatishmi, standart qiymat ishlatishmi, qayta urinib ko'rishmi. panic faqat haqiqatan tiklab bo'lmaydigan holatlar uchun qoldiriladi — masalan dastur ishga tushishida noto'g'ri sozlangan konfiguratsiya (log.Fatalga o'xshab).

>_ Exercise

panic o'rniga error qaytaring.

  • safeSqrt(n float64) (float64, error) yozing: n manfiy bo'lsa xato qaytarsin (panic emas)
  • math.Sqrt bilan natijani hisoblang
  • ikkita holat (musbat va manfiy) uchun chaqirib natijalarni chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Kutubxona kodi panic emas, error qaytarishi kerak — bu chaqiruvchiga vaziyatni o'zi hal qilish imkonini beradi.

NEXT UP

Error Message Style