GoDasturchi
Errors Are Values

Errors Are Values

example.go
func divide(a, b float64) (float64, error) {
	if b == 0 {
		return 0, errors.New("cannot divide by zero")
	}
	return a / b, nil
}

Try/catch yo'q. Yashirin kutilmagan holatlar yo'q. Go'da xatolar shunchaki funksiyalardan qaytariladigan qiymatlardir.

Xato yaratishning eng ko'p ishlatiladigan ikki usuli:

example.go
errors.New("cannot divide by zero")
fmt.Errorf("invalid value: %d", num)

errors.New oddiy satrni oladi. fmt.Errorf esa qiymatlarni xabarga formatlash imkonini beradi, bu uni ko'proq moslashuvchan qiladi. Hammasi joyida bo'lsa, o'rniga nil qaytaring, bu "xato yo'q" degani.

errors.New uchun "errors", fmt.Errorf uchun esa "fmt" kerak. Ikkalasi ham standart kutubxonada joylashgan, shuning uchun ularni import qilishni unutmang.

Bir nechta paketni import qilganingizda, har bir paket o'z qatorida bo'lgan guruhlangan shakldan foydalaning:

example.go
import (
	"errors"
	"fmt"
)

import ("errors" "fmt") ni bitta qatorga yozish sintaksis xatosi. Har bir paket qavslar ichida o'z qatoriga ega bo'ladi.

O'zgaruvchini `error` deb nomlamang

error — Go'da o'rnatilgan tur (built-in type). Agar o'zgaruvchini error deb nomlasangiz, turni soyalab qo'yasiz (shadow) va keyinroq chalkash kompilyatsiya xatolariga duch kelasiz. Qiymat uchun err dan foydalaning:

example.go
result, err := withdraw(100, 30) // yaxshi
result, error := withdraw(100, 30) // qochish kerak, turni soyalaydi

Oldingi darsda muvaffaqiyatsizlikni bildirish uchun bool dan foydalangan edingiz. Bu sizga *nimadir* noto'g'ri ketganini aytadi, lekin *nima* ekanini aytmaydi. Xatolar esa nima uchunligini aytadi:

example.go
result, err := divide(10, 0)
if err != nil {
	fmt.Println(err) // "cannot divide by zero"
}

Muvaffaqiyatsiz bo'lishi mumkin bo'lgan funksiya oxirgi qiymat sifatida error qaytaradi. Chaqiruvchi buni if err != nil bilan tekshiradi.

>_ Exercise

Yechib olishdan (withdrawal) keyingi yangi balansni qaytaradigan withdraw(balance, amount int) (int, error) funksiyasini yozing.

Qoidalar:

  • Agar amount nol yoki manfiy bo'lsa, quyidagi xabar bilan xato qaytaring
  • Agar amount balance dan katta bo'lsa, quyidagi xabar bilan xato qaytaring
  • Aks holda, balance - amount va nil qaytaring

Xato xabarlari aynan quyidagilarga mos kelishi kerak:

example.go
amount must be positive
insufficient funds

Misollar:

  • withdraw(100, 30) 70, nil qaytaradi
  • withdraw(100, 0) 0, error("amount must be positive") qaytaradi
  • withdraw(50, 200) 0, error("insufficient funds") qaytaradi

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Go'da xatolar shunchaki qiymatlardir. Nima noto'g'ri ketganini tushuntirish uchun error qaytaring, if err != nil bilan tekshiring.

NEXT UP

Bytes, Runes & Sized Types

🔒🔒🔒🔒
OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Errors Are Values

example.go
func divide(a, b float64) (float64, error) {
	if b == 0 {
		return 0, errors.New("cannot divide by zero")
	}
	return a / b, nil
}

Try/catch yo'q. Yashirin kutilmagan holatlar yo'q. Go'da xatolar shunchaki funksiyalardan qaytariladigan qiymatlardir.

Xato yaratishning eng ko'p ishlatiladigan ikki usuli:

example.go
errors.New("cannot divide by zero")
fmt.Errorf("invalid value: %d", num)

errors.New oddiy satrni oladi. fmt.Errorf esa qiymatlarni xabarga formatlash imkonini beradi, bu uni ko'proq moslashuvchan qiladi. Hammasi joyida bo'lsa, o'rniga nil qaytaring, bu "xato yo'q" degani.

errors.New uchun "errors", fmt.Errorf uchun esa "fmt" kerak. Ikkalasi ham standart kutubxonada joylashgan, shuning uchun ularni import qilishni unutmang.

Bir nechta paketni import qilganingizda, har bir paket o'z qatorida bo'lgan guruhlangan shakldan foydalaning:

example.go
import (
	"errors"
	"fmt"
)

import ("errors" "fmt") ni bitta qatorga yozish sintaksis xatosi. Har bir paket qavslar ichida o'z qatoriga ega bo'ladi.

O'zgaruvchini `error` deb nomlamang

error — Go'da o'rnatilgan tur (built-in type). Agar o'zgaruvchini error deb nomlasangiz, turni soyalab qo'yasiz (shadow) va keyinroq chalkash kompilyatsiya xatolariga duch kelasiz. Qiymat uchun err dan foydalaning:

example.go
result, err := withdraw(100, 30) // yaxshi
result, error := withdraw(100, 30) // qochish kerak, turni soyalaydi

Oldingi darsda muvaffaqiyatsizlikni bildirish uchun bool dan foydalangan edingiz. Bu sizga *nimadir* noto'g'ri ketganini aytadi, lekin *nima* ekanini aytmaydi. Xatolar esa nima uchunligini aytadi:

example.go
result, err := divide(10, 0)
if err != nil {
	fmt.Println(err) // "cannot divide by zero"
}

Muvaffaqiyatsiz bo'lishi mumkin bo'lgan funksiya oxirgi qiymat sifatida error qaytaradi. Chaqiruvchi buni if err != nil bilan tekshiradi.

>_ Exercise

Yechib olishdan (withdrawal) keyingi yangi balansni qaytaradigan withdraw(balance, amount int) (int, error) funksiyasini yozing.

Qoidalar:

  • Agar amount nol yoki manfiy bo'lsa, quyidagi xabar bilan xato qaytaring
  • Agar amount balance dan katta bo'lsa, quyidagi xabar bilan xato qaytaring
  • Aks holda, balance - amount va nil qaytaring

Xato xabarlari aynan quyidagilarga mos kelishi kerak:

example.go
amount must be positive
insufficient funds

Misollar:

  • withdraw(100, 30) 70, nil qaytaradi
  • withdraw(100, 0) 0, error("amount must be positive") qaytaradi
  • withdraw(50, 200) 0, error("insufficient funds") qaytaradi

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Go'da xatolar shunchaki qiymatlardir. Nima noto'g'ri ketganini tushuntirish uchun error qaytaring, if err != nil bilan tekshiring.

NEXT UP

Bytes, Runes & Sized Types