Пример за исклучок со 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 прикажете различни пораки за грешка за исклучоци од различни типови.