Errors Are Values
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:
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:
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:
result, err := withdraw(100, 30) // yaxshi
result, error := withdraw(100, 30) // qochish kerak, turni soyalaydiOldingi 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:
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
amountnol yoki manfiy bo'lsa, quyidagi xabar bilan xato qaytaring - •Agar
amountbalancedan katta bo'lsa, quyidagi xabar bilan xato qaytaring - •Aks holda,
balance - amountvanilqaytaring
Xato xabarlari aynan quyidagilarga mos kelishi kerak:
amount must be positive
insufficient fundsMisollar:
- •
withdraw(100, 30)70, nilqaytaradi - •
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.
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
$ go run main.go
Kodingizni ishga tushiring