Xatoliklar asoslari
Ko’p tillarda xatolik exception bo’lib otiladi. Go’da esa boshqacha: xatolik (error) — bu oddiy qiymat, funksiya qaytaradigan natijaning bir qismi, xolos. Bu yondashuv “errors are values” deb ataladi. Kelishuvga ko’ra error eng oxirida qaytariladigan qiymat bo’ladi; hammasi joyida bo’lsa u nil, aks holda ichida sabab yoziladi.
if err != nil idiomasi
Xatolikni tekshirishning eng keng tarqalgan usuli — funksiyani chaqirgandan keyin darrov errni nil bilan solishtirish:
package main
import (
"fmt"
"strconv"
)
func main() {
n, err := strconv.Atoi("olma")
if err != nil {
fmt.Println("xatolik:", err)
return
}
fmt.Println("son ikki barobar:", n*2)
}$ go run check.go
xatolik: strconv.Atoi: parsing "olma": invalid syntaxNaqsh har doim bir xil: chaqir, keyin darrov tekshir. Agar err nil bo’lmasa, uni qayta ishlaysiz; nil bo’lsa, natijadan bemalol foydalanaverasiz.
O’z xatoligingizni qaytarish
Xatolikni o’zingiz ham yaratsangiz bo’ladi — o’zgarmas matn uchun errors.New, kontekst qo’shish uchun esa fmt.Errorf (u fmt.Printf kabi formatlaydi):
package main
import (
"errors"
"fmt"
)
func bolish(a, b int) (int, error) {
if b == 0 {
return 0, errors.New("nolga bo'lish mumkin emas")
}
return a / b, nil
}
func main() {
if _, err := bolish(7, 0); err != nil {
fmt.Println("xatolik:", err)
}
if n, err := bolish(10, 2); err == nil {
fmt.Println("natija:", n)
}
fmt.Println(fmt.Errorf("yosh noto'g'ri: %d", -3))
}$ go run bolish.go
xatolik: nolga bo'lish mumkin emas
natija: 5
yosh noto'g'ri: -3Xatolik bilan birga natija sifatida zero qiymat (0) qaytaryapmiz — chaqiruvchi err nil emasligini ko’rsa, natijaga umuman qaramasligi kerak. Kelishuvga ko’ra xatolik matni kichik harf bilan boshlanadi va nuqtasiz tugaydi, chunki xatoliklar ko’pincha bir-biriga ulanib ketadi.
Takeaway: Go’da xatolik — bu qiymat; uni har bir chaqiruvdan keyin if err != nil bilan tekshiring.
Manba / batafsil: Effective Go - Errors , errors paketi
Keyingi mavzuda xatolikning asosi bo’lgan error interfeysini ko’rib chiqamiz.