GoDasturchi
Custom Error Types

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.

example.go
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.

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

example.go
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.

Hints (0/3)

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