Error Handling Basics
Xatolarni boshqarish asoslari
Errors Are Values kursida siz errorni oddiy qiymat sifatida qaytarishni o'rgangansiz. Endi bir qadam chuqurroq: maxsus xato turlari. error — atigi bitta metodli interfeys (Error() string), shuning uchun istalgan turingiz shu metodga ega bo'lsa, u error bo'la oladi:
type NotFoundError struct {
Name string
}
func (e *NotFoundError) Error() string {
return fmt.Sprintf("%s not found", e.Name)
}Bu Interfaces & Polymorphism kursidagi implicit interfeys amalga oshirish g'oyasining amaliy qo'llanilishi. Maxsus xato turining foydasi — unda qo'shimcha ma'lumot saqlash mumkin (bu yerda — Name). Buni qayta olish uchun errors.As ishlatiladi:
var notFound *NotFoundError
if errors.As(err, ¬Found) {
fmt.Println("missing:", notFound.Name)
}errors.As — Go Generics kursidagi ikki qiymatli type assertion (v, ok := x.(T)) g'oyasining xatolar uchun versiyasi: err aslida *NotFoundError ekanligini tekshiradi va bo'lsa, uni notFoundga "quyadi", shunda uning Name maydoniga kirish mumkin bo'ladi.
>_ Exercise
Name string maydonli NotFoundError struct'ini yozing va unga Error() string metodini qo'shing — "<Name> not found" qaytarsin (pointer receiver bilan). FindUser(name string) error funksiyasini yozing — agar name "alice"ga teng bo'lmasa &NotFoundError{Name: name} qaytaradi, aks holda nil. mainda errors.As yordamida xatoni *NotFoundErrorga aylantirib, uning Nameini chop eting.
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Maxsus xato turlari (Error() string metodiga ega struct'lar) oddiy matn xabaridan tashqari qo'shimcha, strukturaviy ma'lumot saqlashi mumkin. errors.As bu ma'lumotni xavfsiz qayta olish uchun standart vosita.
NEXT UP
iota and Const Patterns
$ go run main.go
Kodingizni ishga tushiring