33 / 68

Errors

Xatolar bilan ishlash

Dastur ishlash jarayonida kutilmagan holatlar (masalan, sonni nolga bo'lish, mavjud bo'lmagan faylni ochish) yuz berganda xatoliklar (errors) kelib chiqadi. Masalan:

example.go
package main

import "fmt"

func main() {
    for i := 0; i < 5; i++ {
        result := 20 / i
        fmt.Println(result)
    }
}

Ushbu dasturni ishga tushirsak, integer divide by zero xatoligiga duch kelamiz. Birinchi iteratsiyada i ning qiymati 0 bo'lgani uchun, result := 20 / i qatori sonni nolga bo'lishga urinadi va dastur to'xtaydi.

[!NOTE] Bu misoldagi xatolik — Go tilining o'zida mavjud, o'rnatilgan (built-in) xatolik. Bundan tashqari, Go tilida o'zimiz ham shaxsiy xatoliklar yaratishimiz mumkin.

Boshqa dasturlash tillaridan (Java, Python, C++) farqli o'laroq, Go tilida try/catch bloklari ishlatilmaydi. Goda xatoliklar funksiyadan oddiy qiymat (error) sifatida qaytariladi va err != nil sharti orqali tekshiriladi.


1. errors.New() funksiyasi orqali xatolik yaratish

Goning errors paketidagi New() funksiyasi matn ko'rinishidagi xatolik xabarini yaratish uchun ishlatiladi:

example.go
package main

import (
    "errors"
    "fmt"
)

func checkName(name string) error {
    // Yangi xatolik obyekti yaratamiz
    newError := errors.New("Yaroqsiz ism")

    if name != "Ali" {
        return newError
    }

    // Xato bo'lmasa nil qaytariladi
    return nil
}

func main() {
    name := "Vali"

    err := checkName(name)

    // err nil emasligini tekshiramiz
    if err != nil {
        fmt.Println("Xatolik:", err)
    } else {
        fmt.Println("To'g'ri ism!")
    }
}

Natija:

kod
Xatolik: Yaroqsiz ism

2. fmt.Errorf() orqali formatlangan xatolik yaratish

Agar xatolik xabari ichiga o'zgaruvchilar qiymatini dinamik joylashtirish kerak bo'lsa, fmt.Errorf() funksiyasidan foydalaniladi:

example.go
package main

import "fmt"

func divide(num1, num2 int) error {
    if num2 == 0 {
        return fmt.Errorf("%d / %d: Sonni nolga bo'lib bo'lmaydi!", num1, num2)
    }
    return nil
}

func main() {
    err := divide(4, 0)

    if err != nil {
        fmt.Println("Xato yuz berdi:", err)
    } else {
        fmt.Println("Bo'lish to'g'ri bajarildi")
    }
}

Natija:

kod
Xato yuz berdi: 4 / 0: Sonni nolga bo'lib bo'lmaydi!

3. Shaxsiy xatolik turlarini yaratish (Custom Errors)

Goda error bu aslida bitta metodga ega o'rnatilgan interfeysdir:

example.go
type error interface {
    Error() string
}

Demak, istalgan tuzilma (struct) uchun Error() string metodini yozsak, ushbu tuzilma xatolik sifatida ishlatilishi mumkin:

example.go
package main

import "fmt"

// Maxsus xatolik strukturasi
type DivisionByZero struct {
    message string
}

// error interfeysidagi Error() metodini bajaramiz
func (z DivisionByZero) Error() string {
    return "Sonni nolga bo'lish taqiqlangan!"
}

func divide(n1 int, n2 int) (int, error) {
    if n2 == 0 {
        return 0, &DivisionByZero{}
    }
    return n1 / n2, nil
}

func main() {
    number1 := 15
    number2 := 0

    result, err := divide(number1, number2)

    if err != nil {
        fmt.Println("Xato:", err)
    } else {
        fmt.Printf("Natija: %d\n", result)
    }
}

Natija:

kod
Xato: Sonni nolga bo'lish taqiqlangan!