Xatolarni qayta ishlash: istisnolar yoki qaytariladigan qiymatlar
Amaliyot3 daqInnovialabs tahririyati
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
| Istisnolar | Xato-qiymatlar (Go) | Result (Rust) | |
|---|---|---|---|
| Signaturada ko‘rinadimi | qisman (Java’da checked exceptions) | ha | ha |
| Qayta ishlashni unutish oson | juda oson | err ni e’tiborsiz qoldirish mumkin | kompilyator ogohlantiradi |
| Kod hajmi | kamroq | ko‘proq if err != nil | ? bilan ixcham |
| Yuqoriga uzatish | avtomatik | qo‘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
- Xatolarni yashirmang. Bo‘sh
except: passyoki_ = errmuammoni yashiradi va u keyinroq tushunarsiz joyda paydo bo‘ladi. - Aniq turlarni ushlang.
except Exceptionsizning o‘z xatolaringizni ham ushlab qoladi.FileNotFoundError,TimeoutErrorkabi haqiqatan qayta ishlay oladigan narsalarni ushlang. - 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’dacause. - Biznes holatlar uchun o‘z xato turlaringizni yarating:
InsufficientFundsError,OrderNotFound. Shunda chaqiruvchi kod ularni texnik nosozliklardan ajrata oladi. - 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.
- Bir marta log yozing. Agar har bir qatlam xatoni logga yozib, yana uzatsa, loglarda bitta nosozlikning beshta nusxasi bo‘ladi.
- Xabarlarni ajrating. Foydalanuvchiga — amalga oshirish tafsilotlarisiz tushunarli matn. Logga — stek, parametrlar, so‘rov identifikatori.
Ko‘p uchraydigan xatolar
- Xato o‘rniga
nullyoki-1qaytarish: 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.