Lançamento de exceções em JavaScript
Vamos considerar o bloco catch da tarefa com o JSON do produto:
catch (error) {
if (error.name == 'SyntaxError') {
alert('JSON do produto incorreto');
} else if (error.name == 'ProductCostError') {
alert('O produto não tem preço ou quantidade');
}
}
Como você pode ver, estamos capturando duas exceções
planejadas por nós e reagindo de alguma forma a elas.
Mas o que acontece se ocorrer uma exceção não prevista
de outro tipo? Nesse caso, ela também cairá no bloco
catch, mas não haverá nenhuma reação, pois
a exceção com outro tipo simplesmente não será
capturada por nenhum dos nossos condicionais.
Quando digo que não haverá nenhuma reação, quero dizer que realmente nenhuma: nem mesmo o erro será exibido no console. Nosso código simplesmente não funcionará silenciosamente.
Portanto, existe a seguinte regra: seu código
deve capturar apenas as exceções com as quais
sabe como lidar. Se a exceção for desconhecida,
ela deve ser lançada
adiante usando throw. Nesse caso,
alguém mais bem informado a capturará acima
ou a exceção será exibida como um erro no console.
Vamos corrigir nosso código:
catch (error) {
if (error.name == 'SyntaxError') {
alert('JSON do produto incorreto');
} else if (error.name == 'ProductCostError') {
alert('O produto não tem preço ou quantidade');
} else {
throw error; // lançando a exceção adiante
}
}
É dado o seguinte código:
try {
let arr = JSON.parse(json);
for (let i = 0; i < arr.length; i++) {
localStorage.setItem(i, arr[i]);
}
} catch (error) {
if (error.name == 'QuotaExceededError') {
alert('espaço de armazenamento esgotado');
}
if (error.name == 'SyntaxError') {
alert('JSON incorreto');
}
}
O que há de errado com este código? Corrija-o para uma versão mais adequada.