Мисоли истисно бо data- атрибутҳо дар JavaScript

Фарз кунем, ки ҳангоми бор шудани саҳифа сервер коди HTML-ро месозад, ки дар он ном, нарх ва миқдори маҳсули харидашуда нигоҳ дошта мешавад:

html<div id="product" data-product="себ" data-price="1000" data-amount="5"></div>

Биёед функсияеро созем, ки ба унвони параметр ишора ба унсури маҳсулро қабул кунад ва арзиши пурраи молро ёбад (нархро ба миқдор зарб кунад):

javascriptfunction getCost(elem) {
  return elem.dataset.price * elem.dataset.amount;
}

Биёед арзиши маҳсули худро ёбем:

javascriptlet product = document.querySelector('#product');
let cost = getCost(product);

alert(cost);

Акнун фарз кунем вазъияти зерин: ба сабаби як халокае дар сервер, он ба мо маҳсулеро фиристод, ки дар он нарх ё миқдор (ё ҳарду якбора) мавҷуд нест, масалан, ба ин сурат:

html<div id="product" data-product="себ" data-price="1000"></div>

Акнун агар кӯшиш кунем, ки арзиши маҳсулро ҳисоб кунем, дар натиҷа ба экран NaN бароварда мешавад. Қабул кунед, ки хеле иттилоотӣ нест.

Малом мешавад, ки мо бояд ба тавре худро аз ин хатар, ки атрибутҳои зарурӣ мавҷуд набошанд, муҳофизат кунем. Инро метавон аз ду роҳ анҷом дод. Роҳи аввал - ин гуфтан аст, ки ин рафтори оддӣ аст ва танҳо бо истифода аз if мавҷудият -и атрибутҳои лозимиро тафтиш кардан:

javascriptfunction getCost(elem) {
  if (elem.dataset.price !== undefined && elem.dataset.amount !== undefined) {
    return elem.dataset.price * elem.dataset.amount;
  } else {
    return 0; // чизе бармегардонем, масалан, 0 ё null ё false
  }
}

Имконияти дувум - ин гуфтан аст, ки мавҷуд набудани атрибути data-price ё data-amount - вазъияти истисноӣ аст. Дар ин ҳолат мо истисно партофтанием:

javascriptfunction getCost(elem) {
  if (elem.dataset.price !== undefined && elem.dataset.amount !== undefined) {
    return elem.dataset.price * elem.dataset.amount;
  } else {
    throw {
      name: 'ProductCostError',
      message: 'дар маҳсул нарх ё миқдор мавҷуд нест'
    };
  }
}

Кадоме аз ду варианти дар ин ҷо муносибаттар истифода бурда мешавад - ин ихтиёри барномасоз аст. Вай метавонад мушкилиро кори оддии скрипт ё вазъияти истисноӣ ҳисоб кунад.

Фарз кунем, ки мо қарор додем, ки вазъият истисноӣ аст. Он гоҳ коди ба даст овардани арзиши маҳсул ба ин сурат хоҳад буд:

javascriptlet product = document.querySelector('#product');

try {
  let cost = getCost(product);
  alert(cost);
} catch (error) {
  // ба тавре ба истисно реаксия нишон медиҳем
}
Задание 1

Коди маро тавре тағир диҳед, ки функсияи getCost ду намуди истисно партофта бошад: агар нарх мавҷуд набошад ва агар миқдор мавҷуд набошад. Хуб дар бораи номҳои ин истисноҳо фикр кунед. Дар блоки catch пайғомҳои гуногуни хатогиро барои истисноҳои намудҳои гуногун нишон диҳед.