# Пример исключения с data- атрибутами в JavaScript

Пусть при загрузке страницы сервер создает HTML код, в котором хранится название, цена и количество купленного продукта:

`<div id="product" data-product="яблоко" data-price="1000" data-amount="5"></div>`

Давайте сделаем функцию, которая будет принимать ссылку на элемент с продуктом и находить полную стоимость товара (цену умножать на количество):

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

Найдем стоимость нашего продукта:

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

Предположим теперь следующую ситуацию: из-за какого-то сбоя на сервере он прислал нам товар, в котором отсутствует цена или количество (или оба сразу), например, вот так:

`<div id="product" data-product="яблоко" data-price="1000"></div>`

Если теперь попробовать посчитать стоимость товара, то результате на экран выведется NaN. Согласитесь, не очень информативно.

Получается, нам нужно как-то обезопасится от того, что будут отсутствовать нужные нам атрибуты. Это можно сделать двумя путями. Первый путь - это сказать, что это нормальное поведение и просто проверять ифами наличие нужных нам атрибутов:

`function 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` - исключительная ситуация. В этом случае мы будем выбрасывать исключение:

`function getCost(elem) { if (elem.dataset.price !== undefined && elem.dataset.amount !== undefined) { return elem.dataset.price * elem.dataset.amount; } else { throw { name: 'ProductCostError', message: 'отсутствует цена или количество у продукта' }; } }`

Какой из двух вариантов здесь уместнее применить - это выбор программиста. Он может считать проблему нормальной работой скрипта или исключительной ситуацией.

Пусть мы решили, что ситуация исключительная. Тогда код получения стоимости товара будет выглядеть вот так:

`let product = document.querySelector('#product'); try { let cost = getCost(product); alert(cost); } catch (error) { // как-то реагируем на исключение }`

Переделайте мой код так, чтобы функция `getCost` выбрасывала два типа исключений: если отсутствует цена и если отсутствует количество. Хорошо подумайте над названиями этих исключений. В блоке `catch` выведите разные сообщения об ошибке для исключений разных типов.

← →
↑
en ru