JavaScript-də data- atributları ilə bağlı istisna nümunəsi
Tutaq ki, səhifə yüklənəndə server HTML kodunu yaradır, burada ad, qiymət və alınan məhsulun miqdarı saxlanılır:
<div id="product" data-product="alma" data-price="1000" data-amount="5"></div>
Gəlin məhsula keçid qəbul edən və məhsulun ümumi dəyərini (qiyməti miqdara vurmaqla) tapan funksiya edək:
function getCost(elem) {
return elem.dataset.price * elem.dataset.amount;
}
Gəlin məhsulumuzun dəyərini tapaq:
let product = document.querySelector('#product');
let cost = getCost(product);
alert(cost);
İndi isə belə bir vəziyyəti fərz edək: serverdə bəzi nasazlıq səbəbindən o, bizə qiyməti və ya miqdarı (və ya hər ikisi birdən) olmayan məhsul göndərib, məsələn, belə:
<div id="product" data-product="alma" data-price="1000"></div>
İndi məhsulun dəyərini hesablamağa çalışsaq, nəticədə ekranda NaN görünəcək. Razılaşın, çox informativ deyil.
Belə çıxır ki, bizə lazım olan atributların olmadığı hallardan özümüzü qorumaq lazımdır. Bunu iki yolla etmək olar. Birinci yol - bu normal davranış olduğunu söyləmək və sadəcə if-lərlə lazım olan atributların olub-olmadığını yoxlamaqdır:
function getCost(elem) {
if (elem.dataset.price !== undefined && elem.dataset.amount !== undefined) {
return elem.dataset.price * elem.dataset.amount;
} else {
return 0; // bir şey qaytaraq, məsələn, 0 və ya null və ya false
}
}
İkinci variant - data-price və ya data-amount
atributunun olmamasının istisnai vəziyyət olduğunu söyləməkdir.
Bu halda biz istisna atacağıq:
function getCost(elem) {
if (elem.dataset.price !== undefined && elem.dataset.amount !== undefined) {
return elem.dataset.price * elem.dataset.amount;
} else {
throw {
name: 'ProductCostError',
message: 'məhsulda qiymət və ya miqdar yoxdur'
};
}
}
Burada iki variantdan hansının daha uyğun olduğu - proqramçının seçimidir. O, problemi skriptin normal işi və ya istisnai vəziyyət hesab edə bilər.
Tutaq ki, biz vəziyyətin istisnai olduğuna qərar verdik. Onda məhsulun dəyərini almaq kodu belə görünəcək:
let product = document.querySelector('#product');
try {
let cost = getCost(product);
alert(cost);
} catch (error) {
// istisnaya bir şəkildə reaksiya veririk
}
Kodumu elə dəyişin ki, getCost funksiyası
iki növ istisna atsın: əgər qiymət yoxdursa və əgər miqdar yoxdursa.
Bu istisnaların adları üzərində yaxşı düşünün.
catch blokunda müxtəlif növ istisnalar üçün
müxtəlif xəta mesajları çıxarın.