GoDasturchi
Handle Errors Once

Handle Errors Once

Xatoni faqat bir marta boshqaring

Keng tarqalgan xato: bitta xatoni ham logga yozib, ham qaytarib, ham yana logga yozib — bitta muammo haqida bir necha marta "shovqin" ko'tarish. Yaxshi amaliyot: har bir xatoni faqat bir joyda hal qiling.

example.go
package main

import "fmt"

// Yomon: xato ham chop etiladi, ham qaytariladi — yuqorida yana chop etilsa, ikki marta ko'rinadi
func processOld(n int) (int, error) {
	if n < 0 {
		fmt.Println("xato: manfiy son") // BU YERDA chop etmang!
		return 0, fmt.Errorf("manfiy son: %d", n)
	}
	return n * 2, nil
}

// Yaxshi: faqat qaytaradi, kim chaqirsa o'sha hal qiladi
func process(n int) (int, error) {
	if n < 0 {
		return 0, fmt.Errorf("manfiy son: %d", n)
	}
	return n * 2, nil
}

func main() {
	result, err := process(-5)
	if err != nil {
		fmt.Println("xato:", err) // xato FAQAT shu yerda, bir marta ko'rsatiladi
		return
	}
	fmt.Println(result)
}

Qoida sodda: agar funksiya xatoni qaytarsa, uni o'sha yerda logga yozmang — buni chaqiruvchiga qoldiring. Faqat chaqiruv zanjirining eng tepasida, xato haqiqatan "tugagan" joyda (masalan foydalanuvchiga ko'rsatilganda yoki logga yozilganda) uni bir marta ko'rsating. Aks holda bitta xato dastur logida o'nlab marta takrorlanib chiqishi mumkin.

>_ Exercise

Xatoni faqat bir joyda boshqaring.

  • parseAge(s string) (int, error) yozing: strconv.Atoi ishlatib, xatoni faqat qaytaring (chop etmang)
  • main'da xatoni qabul qilib, faqat shu yerda "xato: ..." deb bir marta chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Har bir xatoni faqat bitta joyda hal qiling — funksiya ichida ham chop etib, ham qaytarish, keyinchalik bitta xatoning bir necha marta ko'rinishiga olib keladi.

NEXT UP

Sentinel Errors

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Handle Errors Once

Xatoni faqat bir marta boshqaring

Keng tarqalgan xato: bitta xatoni ham logga yozib, ham qaytarib, ham yana logga yozib — bitta muammo haqida bir necha marta "shovqin" ko'tarish. Yaxshi amaliyot: har bir xatoni faqat bir joyda hal qiling.

example.go
package main

import "fmt"

// Yomon: xato ham chop etiladi, ham qaytariladi — yuqorida yana chop etilsa, ikki marta ko'rinadi
func processOld(n int) (int, error) {
	if n < 0 {
		fmt.Println("xato: manfiy son") // BU YERDA chop etmang!
		return 0, fmt.Errorf("manfiy son: %d", n)
	}
	return n * 2, nil
}

// Yaxshi: faqat qaytaradi, kim chaqirsa o'sha hal qiladi
func process(n int) (int, error) {
	if n < 0 {
		return 0, fmt.Errorf("manfiy son: %d", n)
	}
	return n * 2, nil
}

func main() {
	result, err := process(-5)
	if err != nil {
		fmt.Println("xato:", err) // xato FAQAT shu yerda, bir marta ko'rsatiladi
		return
	}
	fmt.Println(result)
}

Qoida sodda: agar funksiya xatoni qaytarsa, uni o'sha yerda logga yozmang — buni chaqiruvchiga qoldiring. Faqat chaqiruv zanjirining eng tepasida, xato haqiqatan "tugagan" joyda (masalan foydalanuvchiga ko'rsatilganda yoki logga yozilganda) uni bir marta ko'rsating. Aks holda bitta xato dastur logida o'nlab marta takrorlanib chiqishi mumkin.

>_ Exercise

Xatoni faqat bir joyda boshqaring.

  • parseAge(s string) (int, error) yozing: strconv.Atoi ishlatib, xatoni faqat qaytaring (chop etmang)
  • main'da xatoni qabul qilib, faqat shu yerda "xato: ..." deb bir marta chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Har bir xatoni faqat bitta joyda hal qiling — funksiya ichida ham chop etib, ham qaytarish, keyinchalik bitta xatoning bir necha marta ko'rinishiga olib keladi.

NEXT UP

Sentinel Errors