GoDasturchi
Sentinel Errors

Sentinel Errors

Sentinel xatolar

"Sentinel xato" — oldindan e'lon qilingan, nomlangan xato qiymati (masalan io.EOF, sql.ErrNoRows). Ular "aynan shu xolat yuz berdimi?" deb aniq tekshirish uchun ishlatiladi.

example.go
package main

import (
	"errors"
	"fmt"
)

var (
	ErrOutOfStock  = errors.New("mahsulot tugagan")
	ErrInvalidCode = errors.New("noto'g'ri kod")
)

func checkStock(code string, qty int) error {
	if code != "OK" {
		return ErrInvalidCode
	}
	if qty <= 0 {
		return ErrOutOfStock
	}
	return nil
}

func main() {
	err := checkStock("OK", 0)
	switch {
	case errors.Is(err, ErrOutOfStock):
		fmt.Println("ombordan tugagan, keyinroq urinib ko'ring")
	case errors.Is(err, ErrInvalidCode):
		fmt.Println("kodni tekshiring")
	case err == nil:
		fmt.Println("hammasi joyida")
	}
}

Sentinel xatolar var sifatida paket darajasida e'lon qilinadi (odatda Err prefiksi bilan: ErrNotFound, ErrOutOfStock). Ular chaqiruvchiga aniq qaysi holat yuz berganini errors.Is (yoki oddiy ==, agar o'ralmagan bo'lsa) bilan tekshirish va har biriga mos harakat qilish imkonini beradi — shunchaki "xato bor/yo'q"dan ko'ra ancha aniqroq.

>_ Exercise

Ikkita sentinel xatoni farqlab, mos xabar chiqaring.

  • ErrExpired va ErrRevoked sentinel xatolarini e'lon qiling
  • checkToken(status string) error: "expired" bo'lsa ErrExpired, "revoked" bo'lsa ErrRevoked, aks holda nil
  • errors.Is bilan har biriga mos xabar chiqaring

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Sentinel xatolar (ErrXxx) — muayyan xato holatlarini nomlash va ularni errors.Is bilan aniq tekshirish imkonini beradi.

NEXT UP

Custom Error Types

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Sentinel Errors

Sentinel xatolar

"Sentinel xato" — oldindan e'lon qilingan, nomlangan xato qiymati (masalan io.EOF, sql.ErrNoRows). Ular "aynan shu xolat yuz berdimi?" deb aniq tekshirish uchun ishlatiladi.

example.go
package main

import (
	"errors"
	"fmt"
)

var (
	ErrOutOfStock  = errors.New("mahsulot tugagan")
	ErrInvalidCode = errors.New("noto'g'ri kod")
)

func checkStock(code string, qty int) error {
	if code != "OK" {
		return ErrInvalidCode
	}
	if qty <= 0 {
		return ErrOutOfStock
	}
	return nil
}

func main() {
	err := checkStock("OK", 0)
	switch {
	case errors.Is(err, ErrOutOfStock):
		fmt.Println("ombordan tugagan, keyinroq urinib ko'ring")
	case errors.Is(err, ErrInvalidCode):
		fmt.Println("kodni tekshiring")
	case err == nil:
		fmt.Println("hammasi joyida")
	}
}

Sentinel xatolar var sifatida paket darajasida e'lon qilinadi (odatda Err prefiksi bilan: ErrNotFound, ErrOutOfStock). Ular chaqiruvchiga aniq qaysi holat yuz berganini errors.Is (yoki oddiy ==, agar o'ralmagan bo'lsa) bilan tekshirish va har biriga mos harakat qilish imkonini beradi — shunchaki "xato bor/yo'q"dan ko'ra ancha aniqroq.

>_ Exercise

Ikkita sentinel xatoni farqlab, mos xabar chiqaring.

  • ErrExpired va ErrRevoked sentinel xatolarini e'lon qiling
  • checkToken(status string) error: "expired" bo'lsa ErrExpired, "revoked" bo'lsa ErrRevoked, aks holda nil
  • errors.Is bilan har biriga mos xabar chiqaring

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Sentinel xatolar (ErrXxx) — muayyan xato holatlarini nomlash va ularni errors.Is bilan aniq tekshirish imkonini beradi.

NEXT UP

Custom Error Types