Custom Error Types
Maxsus xato turlari
Ba'zan xato haqida ko'proq ma'lumot (masalan qaysi maydon, qaysi qiymat) kerak bo'ladi. Bunday holda oddiy errors.New yetarli emas — o'zingizning xato turingizni yaratasiz.
package main
import (
"errors"
"fmt"
)
type ValidationError struct {
Field string
Msg string
}
// error interfeysini amalga oshirish uchun Error() string metodi kerak
func (e *ValidationError) Error() string {
return fmt.Sprintf("%s: %s", e.Field, e.Msg)
}
func validate(age int) error {
if age < 0 {
return &ValidationError{Field: "age", Msg: "manfiy bo'lishi mumkin emas"}
}
return nil
}
func main() {
err := validate(-5)
var ve *ValidationError
if errors.As(err, &ve) {
fmt.Println(ve.Field, ve.Msg)
}
}ValidationError — oddiy struct, lekin unga Error() string metodi qo'shilgani uchun u error interfeysini amalga oshiradi ("Interfaces & Polymorphism" kursida ko'rgan tamoyil). errors.As(err, &ve) — errors.Isdan farqli, "bu xato aynan *ValidationError turimi?" deb so'raydi va agar shunday bo'lsa, ve orqali uning maxsus maydonlariga (Field, Msg) kirish imkonini beradi.
>_ Exercise
RangeError maxsus turini yarating.
- •RangeError struct'i (Value, Min, Max int) va Error() metodi yozing
- •checkRange(v, min, max int) error: v oralig'dan tashqarida bo'lsa &RangeError{...} qaytarsin
- •errors.As bilan xatoni tutib, Value/Min/Max ni chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Error() string metodi bilan o'z xato turingizni yaratib, errors.As orqali undagi qo'shimcha maydonlarga kirish mumkin.
NEXT UP
Don't Panic in Libraries
$ go run main.go
Kodingizni ishga tushiring