Go by Example: Custom Errors

Maxsus xato tiplarini ularda Error() metodini amalga oshirish orqali aniqlash mumkin. Quyida argument xatosini oshkora ifodalash uchun maxsus tipdan foydalanadigan yuqoridagi misolning bir variantini ko’rasiz.

package main
import (
    "errors"
    "fmt"
)

Maxsus xato tipi odatda “Error” qo’shimchasiga ega bo’ladi.

type argError struct {
    arg     int
    message string
}

Ushbu Error metodini qo’shish argError ni error interfeysini amalga oshiradigan qiladi.

func (e *argError) Error() string {
    return fmt.Sprintf("%d - %s", e.arg, e.message)
}
func f(arg int) (int, error) {
    if arg == 42 {

Maxsus xatomizni qaytaramiz.

        return -1, &argError{arg, "can't work with it"}
    }
    return arg + 3, nil
}
func main() {

errors.AsType errors.Is ning yanada ilg’or versiyasidir. U berilgan xato (yoki uning zanjiridagi har qanday xato) muayyan xato tipiga mos kelishini tekshiradi va uni o’sha tipdagi qiymatga aylantiradi hamda true ni qaytaradi. Agar moslik bo’lmasa, ikkinchi qaytariladigan qiymat false bo’ladi.

    _, err := f(42)
    if ae, ok := errors.AsType[*argError](err); ok {
        fmt.Println(ae.arg)
        fmt.Println(ae.message)
    } else {
        fmt.Println("err doesn't match argError")
    }
}
$ go run custom-errors.go
42
can't work with it

Keyingi misol: .