JavaScript'da xatoliklarni boshqarish: try, catch, finally bloklari, Error obyekti xususiyatlari, throw operatori, Custom Error klasslari va turli xatoliklarni ajratish.
Har qanday dastur ishlash jarayonida xatoliklarga duch kelishi mumkin. Bu bobda xatoliklarni qanday "ushlash" va boshqarishni o'rganamiz.
Xatolik (error) — dastur kutilmagan holatga duch kelganda yuzaga keladi (masalan, mavjud bo'lmagan functionni chaqirish, noto'g'ri ma'lumot turi bilan ishlash).
Agar xatolik boshqarilmasa, butun dastur "yiqiladi" (crash bo'ladi) va foydalanuvchi hech qanday tushunarli xabar olmaydi.
🧯 try/catch — bu yong'in signalizatsiyasi: "xavfli" kod (try) ichida muammo yuz bersa, tizim uni ushlab qoladi (catch) va dastur butunlay "yonib ketishining" oldini oladi.
script.jsJavaScriptconsole.log("Boshlanishi");let result = undefinedFunction(); // ReferenceErrorconsole.log("Bu qator hech qachon ishlamaydi");
Xatolik yuz berganda, dastur o'sha yerda to'xtaydi, undan keyingi barcha kod ishlamay qoladi.
try bloki ichida "xavfli" kod yoziladi, agar xatolik yuz bersa, catch bloki uni ushlab, dastur ishlashini davom ettirishga imkon beradi.
script.jsJavaScripttry {let result = undefinedFunction();} catch (error) {console.log("Xatolik yuz berdi: " + error.message);}console.log("Dastur davom etmoqda");
Natija:
code.textTEXTXatolik yuz berdi: undefinedFunction is not definedDastur davom etmoqda
try blokidagi kod bajariladi.try blokidagi qolgan kod darhol to'xtaydi.catch(error) bloki ishga tushadi, error — xatolik haqida ma'lumotga ega object.catchdan keyingi kod odatdagidek davom etadi.| Xususiyat | Tavsifi |
|---|---|
error.message | Xatolik haqida tushunarli matn |
error.name | Xatolik turi (masalan, TypeError, ReferenceError) |
error.stack | Xatolik qayerda yuz berganini ko'rsatuvchi texnik ma'lumot |
script.jsJavaScripttry {null.someProperty;} catch (error) {console.log(error.name); // "TypeError"console.log(error.message); // "Cannot read properties of null..."}
finally — xatolik yuz berdimi yoki yo'qmi, har doim ishga tushadigan blok.
script.jsJavaScriptfunction readFile() {try {console.log("Fayl o'qilmoqda...");throw new Error("Fayl topilmadi");} catch (error) {console.log("Xatolik: " + error.message);} finally {console.log("Fayl yopildi");}}readFile();
Natija:
code.textTEXTFayl o'qilmoqda...Xatolik: Fayl topilmadiFayl yopildi
💡 Key Idea
finally — odatda "tozalash" (cleanup) ishlari uchun ishlatiladi: fayl yopish, ulanishni uzish, loading holatini o'chirish va h.k. — xatolik bo'ladimi yo'qmi, bu ishlar baribir bajarilishi kerak.
throw — dasturchi o'zi maxsus xatolik yaratib, uni "otish" (chaqirish) imkonini beradi.
script.jsJavaScriptfunction divide(a, b) {if (b === 0) {throw new Error("Nolga bo'lish mumkin emas");}return a / b;}try {console.log(divide(10, 0));} catch (error) {console.log(error.message); // "Nolga bo'lish mumkin emas"}
throw new Error(...) — o'zimiz xohlagan sharoitda maxsus xatolik yaratish imkonini beradi, bu esa functionni "noto'g'ri" ma'lumot bilan ishlashdan himoya qiladi.
⚠️ Common Mistake
throwdan keyin kod darhol to'xtaydi (returnga o'xshab), shuning uchun throwdan keyingi qatorlar hech qachon bajarilmaydi.
Ba'zida oddiy Error yetarli emas — turli xil xatolik turlarini bir-biridan ajratish kerak bo'ladi. Buning uchun Errordan meros oluvchi (Chapter 23'da chuqur o'rganiladi) maxsus Error class'lar yaratiladi.
Katta dasturlarda ko'plab turli xatoliklar bo'lishi mumkin: tarmoq xatoligi, validatsiya xatoligi, ruxsat xatoligi va h.k. Agar ularning barchasi oddiy Error bo'lsa, ularni bir-biridan ajratish qiyin bo'ladi.
script.jsJavaScriptclass ValidationError extends Error {constructor(message) {super(message);this.name = "ValidationError";}}function checkAge(age) {if (age < 0) {throw new ValidationError("Yosh manfiy bo'lishi mumkin emas");}return age;}try {checkAge(-5);} catch (error) {if (error instanceof ValidationError) {console.log("Validatsiya xatoligi: " + error.message);} else {console.log("Boshqa xatolik: " + error.message);}}
ValidationError — Errordan meros oladi (extends Error).super(message) — ota-klass (Error)ning constructor'ini chaqiradi.error instanceof ValidationError — xatolik aynan shu turdami, deb tekshiradi.🔗 Connection
Bu mavzu to'liq tushunish uchun Chapter 22 (Classes) va Chapter 23 (Inheritance)ni bilish kerak bo'ladi — ular hali oldinda.
script.jsJavaScriptfunction processData(data) {if (typeof data !== "string") {throw new TypeError("Ma'lumot string bo'lishi kerak");}if (data.length === 0) {throw new RangeError("Ma'lumot bo'sh bo'lmasligi kerak");}return data.toUpperCase();}try {processData("");} catch (error) {if (error instanceof TypeError) {console.log("Type xatoligi: " + error.message);} else if (error instanceof RangeError) {console.log("Range xatoligi: " + error.message);} else {console.log("Noma'lum xatolik: " + error.message);}}
Task:
try/catch yordamida mavjud bo'lmagan variable'ni chiqarishga urinib ko'ring va xatolikni ushlab, konsolga "Xatolik ushlandi" deb chiqaring.
Required Concepts:
try/catchtry ichida hech qachon e'lon qilinmagan variable'ni console.log qiling.Task:
checkPassword(password) function yozing — agar parol 8 belgidan kam bo'lsa, throw new Error(...) orqali xatolik yarating, try/catch bilan ushlab, tushunarli xabar chiqaring.
Required Concepts:
throwtry/catchif (password.length < 8) { throw new Error("..."); }Task:
Ikkita custom error class yarating: NetworkError va ValidationError (ikkalasi ham Errordan meros olsin). fetchData(url) nomli function yozing — agar url bo'sh bo'lsa ValidationError, agar url "http" bilan boshlanmasa NetworkError chiqarsin. try/catch bilan har ikkala holatni alohida-alohida boshqaring.
Required Concepts:
instanceofthrowValidationError misolidan namuna oling.script.jsJavaScriptfunction test() {try {console.log("A");throw new Error("Xato");console.log("B");} catch (error) {console.log("C");} finally {console.log("D");}console.log("E");}test();
🧠 Think first! Javobni ko'rishdan oldin kamida 30 soniya o'ylang.
<details> <summary>Answer</summary> A C D EWhy?
"A" chiqadi, keyin throw ishga tushib, try blokini darhol to'xtatadi ("B" hech qachon chiqmaydi). catch bloki ishga tushib "C" chiqadi. finally — har doim ishga tushadi, "D" chiqadi. Xatolik ushlab olingani uchun (function "yiqilib" ketmagani uchun), function davom etadi va "E" ham chiqadi.
Quyidagi kodda muammo bor:
script.jsJavaScriptfunction getUser(id) {if (!id) {throw "ID berilmagan"; // string sifatida throw qilinmoqda}return { id: id, name: "Test User" };}try {getUser();} catch (error) {console.log(error.message); // undefined chiqadi}
Your Task:
error.message undefined ekanini tushuntiring.Yechim:
script.jsJavaScriptfunction getUser(id) {if (!id) {throw new Error("ID berilmagan");}return { id: id, name: "Test User" };}try {getUser();} catch (error) {console.log(error.message); // "ID berilmagan"}
⚠️ Best Practice: throw qilishda har doim new Error(...) (yoki undan meros olgan class) ishlatish tavsiya etiladi, oddiy string yoki boshqa qiymat emas.
try/catch — xatolikni ushlab, dastur "yiqilib ketishining" oldini oladi.finally — xatolik bo'ladimi yo'qmi, har doim ishga tushadi.throw — o'z xatoligingizni yaratish va "otish" imkonini beradi.instanceof — xatolik qaysi turga tegishli ekanini tekshiradi.throw new Error(...) ishlating, oddiy string emas.finally — tozalash ishlari (cleanup) uchun ideal joy.error.message, error.name — xatolik haqida foydali ma'lumot beradi.try/catch faqat sinxron kodda ishlaydi — asinxron kod uchun Chapter 27-28'da boshqa usullarni ko'ramiz.script.jsJavaScripttry {// xavfli kodthrow new Error("Xabar");} catch (error) {console.log(error.message);} finally {console.log("Har doim ishga tushadi");}class MyError extends Error {constructor(message) {super(message);this.name = "MyError";}}
Mavzu bo‘yicha tushunchalaringizni interaktiv test orqali sinovdan o‘tkazing va natijalarni bilib oling.
Darslikda o‘rganilgan qoidalarga asosan real kod yozing, testlardan o‘tkazing va yechimlarni mustahkamlang.
Test Sinovi
Hali topshirilmagan (kamida 75% kerak)
Amaliy Masalalar
0 / 3 ta yechildi (kamida 75% kerak)
Dars sifati va mazmunini yaxshilash uchun o‘z haqqoniy bahoingizni qoldiring.
Mavzuni to‘liq o‘zlashtirish uchun test sinovi, amaliy kodlash va bog‘liq darslar
O‘z bilimingizni interaktiv test savollari orqali tekshiring va darhol xatolarni tahlil qiling.
Nazariyani real kod yozish bilan mustahkamlang, avtomatik testlardan o‘ting va XP to‘plang.
Kurs bo‘yicha keyingi va bog‘liq mavzular: