Asosiy kontentga o‘tish
Innovialabs

Xatolarni qayta ishlash: istisnolar yoki qaytariladigan qiymatlar

Amaliyot3 daq

Qisqacha

Istisnolar xatoni stek bo‘ylab uzoqqa uzatish kerak bo‘lganda qulay, xato-qiymatlar va Result esa har bir nosozlikni signaturada aniq ko‘rsatadi. Yondashuvdan muhimrog‘i — xatolarni yo‘qotmaslik, kontekst qo‘shish va ularni qaror qabul qilish mumkin bo‘lgan joyda qayta ishlash.

Qisqa javob

Hamma holatga mos eng yaxshi yondashuv yo‘q — odatda til siz uchun tanlaydi. Istisnolar (Python, Java, C#, JavaScript) bajarilishni to‘xtatadi va kimdir ushlamaguncha stek bo‘ylab yuqoriga ko‘tariladi. Xato-qiymatlar (Go) va Result turi (Rust) oddiy natija kabi qaytariladi va chaqiruvchi kod ular bilan nimadir qilishi shart.

Yaxshi xato qayta ishlash uchta qoidaga tayanadi: nosozliklarni yashirmaslik, kontekst qo‘shish va xatoni qaror qabul qilish mumkin bo‘lgan joyda qayta ishlash.

Turli tillarda bu qanday ko‘rinadi

Python — istisnolar:

def load_config(path):
    try:
        with open(path) as f:
            return json.load(f)
    except FileNotFoundError as e:
        raise ConfigError(f"config not found: {path}") from e

Go — xato qiymat sifatida:

func LoadConfig(path string) (*Config, error) {
    data, err := os.ReadFile(path)
    if err != nil {
        return nil, fmt.Errorf("load config %s: %w", path, err)
    }
    // ...
}

Rust — Result va ? operatori:

fn load_config(path: &str) -> Result<Config, ConfigError> {
    let data = std::fs::read_to_string(path)?;
    let config = parse(&data)?;
    Ok(config)
}

Yondashuvlarni solishtirish

IstisnolarXato-qiymatlar (Go)Result (Rust)
Signaturada ko‘rinadimiqisman (Java’da checked exceptions)haha
Qayta ishlashni unutish osonjuda osonerr ni e’tiborsiz qoldirish mumkinkompilyator ogohlantiradi
Kod hajmikamroqko‘proq if err != nil? bilan ixcham
Yuqoriga uzatishavtomatikqo‘lda? orqali

Istisnolar haqiqatan ham favqulodda holatlar uchun yaxshi. Xato-qiymatlar nosozlik oddiy ssenariy bo‘lgan joyda qulay: fayl yo‘q, foydalanuvchi noto‘g‘ri ma’lumot kiritdi, servis ishlamayapti.

Har qanday tilda ishlaydigan qoidalar

  1. Xatolarni yashirmang. Bo‘sh except: pass yoki _ = err muammoni yashiradi va u keyinroq tushunarsiz joyda paydo bo‘ladi.
  2. Aniq turlarni ushlang. except Exception sizning o‘z xatolaringizni ham ushlab qoladi. FileNotFoundError, TimeoutError kabi haqiqatan qayta ishlay oladigan narsalarni ushlang.
  3. Kontekst qo‘shing. «file not found» xabari fayl nomi va amalsiz foydasiz. Asl sababni saqlang: Python’da raise ... from e, Go’da %w, Java va JavaScript’da cause.
  4. Biznes holatlar uchun o‘z xato turlaringizni yarating: InsufficientFundsError, OrderNotFound. Shunda chaqiruvchi kod ularni texnik nosozliklardan ajrata oladi.
  5. To‘g‘ri darajada qayta ishlang. Past darajadagi funksiya xatoni kontekst bilan yuqoriga uzatadi. Qayta urinish, xabar ko‘rsatish yoki HTTP 404 qaytarish haqidagi qarorni ssenariyni biladigan qatlam qabul qiladi.
  6. Bir marta log yozing. Agar har bir qatlam xatoni logga yozib, yana uzatsa, loglarda bitta nosozlikning beshta nusxasi bo‘ladi.
  7. Xabarlarni ajrating. Foydalanuvchiga — amalga oshirish tafsilotlarisiz tushunarli matn. Logga — stek, parametrlar, so‘rov identifikatori.

Ko‘p uchraydigan xatolar

  • Xato o‘rniga null yoki -1 qaytarish: chaqiruvchi kod sababni bilmaydi.
  • Istisnolardan oddiy boshqaruv oqimi uchun, masalan sikldan chiqish uchun foydalanish.
  • Foydalanuvchiga stek yoki SQL xatosi matnini ko‘rsatish — bu xavfsizlik uchun ham xavf.
  • So‘rovni pauza va urinishlar chegarasisiz cheksiz takrorlash.

Ko‘p beriladigan savollar

Tanlangan til idiomalariga amal qiling. Python va Java’da istisnolar, Go’da xato-qiymatlar, Rust’da Result bilan ishlang. Bitta loyihada uslublarni aralashtirish ulardan birini izchil qo‘llashdan yomonroq.

Yana o‘qing

G‘oya yoki vazifangiz bormi? Bizga aytib bering

Ish kuni davomida javob beramiz va yechim taklif qilamiz. Konsultatsiya bepul.