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:
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.
errors.New() funksiyasi orqali xatolik yaratishGoning errors paketidagi New() funksiyasi matn ko'rinishidagi xatolik xabarini yaratish uchun ishlatiladi:
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:
Xatolik: Yaroqsiz ism
fmt.Errorf() orqali formatlangan xatolik yaratishAgar xatolik xabari ichiga o'zgaruvchilar qiymatini dinamik joylashtirish kerak bo'lsa, fmt.Errorf() funksiyasidan foydalaniladi:
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:
Xato yuz berdi: 4 / 0: Sonni nolga bo'lib bo'lmaydi!
Goda error bu aslida bitta metodga ega o'rnatilgan interfeysdir:
type error interface {
Error() string
}
Demak, istalgan tuzilma (struct) uchun Error() string metodini yozsak, ushbu tuzilma xatolik sifatida ishlatilishi mumkin:
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:
Xato: Sonni nolga bo'lish taqiqlangan!