JavaScript-da istisnolarni uzatish
JSON mahsuloti vazifasi uchun catch blokini ko'rib chiqamiz:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Noto‘g‘ri JSON mahsuloti');
} else if (error.name == 'ProductCostError') {
alert('Mahsulotda narx yoki miqdor yo‘q');
}
}
Ko'rib turganingizdek, biz rejalashtirgan ikkita istisnoni
ushlaymiz va bunga qandaydir reaktsiya ko'rsatamiz.
Ammo agar biz rejalashtirmagan boshqa turdagi istisno
paydo bo'lsa nima bo'ladi? Bunday holda
u catch blokiga tushadi, lekin
unga hech qanday reaktsiya bo'lmaydi, chunki
boshqa turdagi istisno bizning shartlarimizning
hech biriga to'g'ri kelmaydi.
Hech qanday reaktsiya bo'lmasa deganida, men haqiqatan ham hech narsa bo'lmasligini nazarda tutyapman: hatto konsolda xato ham chiqmaydi. Bizning kodimiz shunchaki jim ishlamay qoladi.
Shuning uchun quyidagi qoida mavjud: sizning
kodingiz faqat qanday hal qilishni biladigan
istisnolarni ushlashi kerak. Agar istisno
noma'lum bo'lsa, uni throw yordamida
uzatib yuborish kerak. Bunday holda
uni yuqorida ko'proq biladigan kimdir ushlaydi
yoki istisno konsolda xato sifatida paydo bo'ladi.
Keling, kodimizni tuzatamiz:
catch (error) {
if (error.name == 'SyntaxError') {
alert('Noto‘g‘ri JSON mahsuloti');
} else if (error.name == 'ProductCostError') {
alert('Mahsulotda narx yoki miqdor yo‘q');
} else {
throw error; // istisnoni keyingi bosqichga uzatamiz
}
}
Quyidagi kod berilgan:
try {
let arr = JSON.parse(json);
for (let i = 0; i < arr.length; i++) {
localStorage.setItem(i, arr[i]);
}
} catch (error) {
if (error.name == 'QuotaExceededError') {
alert('saqlash joyida joy qolmadi');
}
if (error.name == 'SyntaxError') {
alert('noto‘g‘ri JSON');
}
}
Ushbu kodda nima noto‘g‘ri? Uni yaxshiroq versiyasiga o'zgartiring.