Exemplo de exceção com atributos data- em JavaScript
Suponha que, ao carregar a página, o servidor crie um código HTML que armazena o nome, o preço e a quantidade do produto comprado:
<div id="product" data-product="maçã" data-price="1000" data-amount="5"></div>
Vamos criar uma função que receberá uma referência ao elemento do produto e calculará o custo total do item (preço multiplicado pela quantidade):
function getCost(elem) {
return elem.dataset.price * elem.dataset.amount;
}
Vamos encontrar o custo do nosso produto:
let product = document.querySelector('#product');
let cost = getCost(product);
alert(cost);
Agora, suponha a seguinte situação: devido a alguma falha no servidor, ele nos enviou um produto que não tem preço ou quantidade (ou ambos), por exemplo, assim:
<div id="product" data-product="maçã" data-price="1000"></div>
Se tentarmos calcular o custo do produto agora, o resultado exibido na tela será NaN. Concorda, não é muito informativo.
Isso significa que precisamos de alguma forma nos proteger contra a ausência dos atributos de que precisamos. Isso pode ser feito de duas maneiras. A primeira maneira é considerar isso um comportamento normal e simplesmente verificar a presença dos atributos necessários com instruções if:
function getCost(elem) {
if (elem.dataset.price !== undefined && elem.dataset.amount !== undefined) {
return elem.dataset.price * elem.dataset.amount;
} else {
return 0; // retornamos algo, por exemplo, 0 ou null ou false
}
}
A segunda opção é considerar que a ausência
do atributo data-price ou data-amount
é uma situação excepcional. Nesse caso,
lançaremos uma exceção:
function getCost(elem) {
if (elem.dataset.price !== undefined && elem.dataset.amount !== undefined) {
return elem.dataset.price * elem.dataset.amount;
} else {
throw {
name: 'ProductCostError',
message: 'preço ou quantidade ausentes para o produto'
};
}
}
Qual das duas opções é mais apropriada aplicar aqui - é uma escolha do programador. Ele pode considerar o problema como parte do funcionamento normal do script ou como uma situação excepcional.
Digamos que decidimos que a situação é excepcional. Então, o código para obter o custo do produto ficaria assim:
let product = document.querySelector('#product');
try {
let cost = getCost(product);
alert(cost);
} catch (error) {
// reagimos de alguma forma à exceção
}
Modifique meu código para que a função getCost
lance dois tipos de exceções: se o preço estiver ausente
e se a quantidade estiver ausente. Pense bem
sobre os nomes dessas exceções.
No bloco catch, exiba mensagens de erro diferentes
para exceções de tipos diferentes.