Пример исключения с 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
выведите разные сообщения об
ошибке для исключений разных типов.