Фронтендщик
Відкрити в Telegram
Все для frontend developer, шуточки, тесты, статьи Администрация/Реклама @vtopua
Показати більше1 076
Підписники
Немає даних24 години
-57 днів
-1230 днів
Архів дописів
1 076
Второй вариант - это сказать, что отсутствие атрибута 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: 'отсутствует
цена или количество
у продукта'
};
}
}
📌 #instr || Фронтендщик
1 076
Первый путь - это сказать, что это нормальное поведение и просто проверять ифами наличие нужных нам атрибутов:
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
}
}
📌 #instr || Фронтендщик
1 076
Если теперь попробовать посчитать стоимость товара, то результате на экран выведется NaN. Согласитесь, не очень информативно.
Получается, нам нужно как-то обезопасится от того, что будут отсутствовать нужные нам атрибуты. Это можно сделать двумя путями.
📌 #instr || Фронтендщик
1 076
Найдем стоимость нашего продукта:
let product = document.querySelector('#product');
let cost = getCost(product);
alert(cost);
Предположим теперь следующую ситуацию: из-за какого-то сбоя на сервере он прислал нам товар, в котором отсутствует цена или количество (или оба сразу), например, вот так:
<div id="product"
data-product="яблоко" data-price="1000">
</div>
📌 #instr || Фронтендщик
1 076
Давайте сделаем функцию, которая будет принимать ссылку на элемент с продуктом и находить полную стоимость товара (цену умножать на количество):
function getCost(elem) {
return elem.dataset.price
* elem.dataset.amount;
}
📌 #instr || Фронтендщик
1 076
Пример исключения с data- атрибутами в JavaScript
Пусть при загрузке страницы сервер создает HTML код, в котором хранится название, цена и количество купленного продукта:
<div id="product"
data-product="яблоко" data-price="1000"
data-amount="5"></div>
📌 #instr || Фронтендщик
1 076
Существуют разные способы сделать это. Самый простой - в throw передать объект с ключами name и message:
try {
throw {name: 'MyError',
message: 'текст
исключения'};
} catch (error) {
console.log(error.name);
// 'MyError'
console.log(error.message);
// 'текст
исключения'
}
📌 #instr || Фронтендщик
1 076
Выбрасывание своих типов исключений в JavaScript
Количество встроенных в JavaScript исключений не такое большое и они чаще всего не могут удовлетворить все наши потребности в разных типах исключений. Поэтому в JavaScript встроена возможность создавать исключения со своим типом.
📌 #instr || Фронтендщик
1 076
В JavaScript предусмотрено решение этой проблемы: можно выбрасывать исключения не только типа
Error, но и любого встроенного в JavaScript типа ошибки, например, TypeError, SyntaxError, RangeError.
Давайте для примера выбросим исключение типа
SyntaxError:
try {
throw new SyntaxError('текст
исключения');
} catch (error) {
console.log(error.name);
// 'SyntaxError'
console.log(error.message);
// 'текст
исключения'
}
📌 #instr || Фронтендщик
1 076
Как вы видите, тип нашего исключения - 'Error'. Такой же тип будет у любых исключений, выброшенных подобным образом. Это, однако, не всегда будет удобно, так как, если у нас могут быть несколько исключений, мы не сможем их отличить друг от друга.
📌 #instr || Фронтендщик
1 076
Давайте для примера выбросим исключение типа SyntaxError:
try {
throw new SyntaxError('текст
исключения');
} catch (error) {
console.log(error.name);
// 'SyntaxError'
console.log(error.message);
// 'текст
исключения'
}
📌 #instr || Фронтендщик
1 076
В JavaScript предусмотрено решение этой проблемы: можно выбрасывать исключения не только типа Error, но и любого встроенного в JavaScript типа ошибки, например, TypeError, SyntaxError, RangeError.
📌 #instr || Фронтендщик
1 076
Как вы видите, тип нашего исключения - 'Error'. Такой же тип будет у любых исключений, выброшенных подобным образом. Это, однако, не всегда будет удобно, так как, если у нас могут быть несколько исключений, мы не сможем их отличить друг от друга.
📌 #instr || Фронтендщик
1 076
Выбрасывание различных типов исключений в JavaScript
Давайте выбросим свое исключение и посмотрим, как будет вести себя объект с ошибкой в этом случае:
try {
throw new Error('текст
исключения');
} catch (error) {
console.log(error.name);
// 'Error'
console.log(error.message);
// 'текст
исключения'
}
📌 #instr || Фронтендщик
1 076
Давайте теперь будем перехватывать нашу ошибку и как-то ее обрабатывать:
try {
alert( div(3, 0) );
} catch (error) {
alert('вы пытаетесь
делить на
0, что запрещено');
}
📌 #instr || Фронтендщик
1 076
Давайте для начала просто попробуем поделить на 0, не перехватывая исключение:
alert( div(3, 0) );
В этом случае выполнение скрипта прервется и в консоли появится ошибка с текстом 'ошибка деления на ноль' (проверьте).
📌 #instr || Фронтендщик
1 076
Давайте будем считать, что деление на ноль запрещено и при попытке сделать это должна возникать исключительная ситуация. Для этого будем проверять в функции, нет ли попытки делить на 0. Если нет - будем делить, а если да - будем бросать исключение:
function div(a, b) {
if (b !== 0) {
return a / b;
} else {
throw new Error('ошибка
деления на
ноль');
}
}
📌 #instr || Фронтендщик
1 076
Выбрасывание исключения заставляет JavaScript считать, что случилась исключительная ситуация. Это значит, что такое исключение можно отловить с помощью конструкции try-catch и обработать нужным образом.
Давайте посмотрим на примере, как этим пользоваться. Пусть у нас есть функция, которая делит одно число на другое:
function div(a, b) {
return a / b;
}
📌 #instr || Фронтендщик
1 076
Давайте разберем синтаксис, необходимый для этого. Для начала исключение нужно создать с помощью команды new Error, параметром передав текст исключения:
new Error('текст исключения');
Затем это исключение нужно выбросить с помощью команды throw:
throw new Error('текст
исключения');
📌 #instr || Фронтендщик
1 076
Выбрасывание исключений в JavaScript
В предыдущих уроках мы изучили два места, в которых JavaScript выбрасывает исключение в случае каких-то проблем.
В вашем проекте, однако, могут быть и другие ситуации, которые для вас являются исключительными, а для JavaScript - нет. В таком случае мы можете создавать и выбрасывать свои, пользовательские исключения.
📌 #instr || Фронтендщик
