Прыклад выключэння з 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. Згодзіцеся, не вельмі інфарматыўна.

Атрымліваецца, нам трэба як-небудзь абараніцца ад таго, што будуць адсутнічаць патрэбныя нам атрыбуты. Гэта можна зрабіць двума шляхамі. Першы шлях - гэта сказаць, што гэта нармальная паводзіны і проста правяраць іфамі наяўнасць патрэбных нам атрыбутаў:

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 выведзьце розныя паведамленні аб памылцы для выключэнняў розных тыпаў.