Erros em JavaScript
Um erro é a forma de uma função recusar continuar. Esta página usa { drink: "tea" } sem size. throw new Error("missing size") pára label de imediato, antes de return. catch recebe esse Error. A linha da página lê-se caught / missing size.
Não é a página de depuração
A página anterior chamou console.error("missing size") e depois devolveu um texto de reserva. O script continuou. Nada foi lançado. console.error não lança.
throw é diferente. As linhas a seguir nessa função não correm. Só catch pode assumir. A linha de depuração anterior era fixed / tea / regular.
Um Error traz duas cadeias
new Error("missing size") cria um objeto. error.name é Error. error.message é o texto passado, missing size. Registar o objeto ajuda menos do que registar esses dois campos.
catch recebe o Error
label lança quando falta size. A chamada está dentro de try, por isso catch corre e imprime error.message. O texto é missing size.
function label(order) {
if (!order.size) {
throw new Error("missing size");
}
return order.drink + " / " + order.size;
}
try {
console.log(label({ drink: "tea" }));
} catch (error) {
console.log(error.message);
}
O registo é missing size. label nunca chegou ao return, portanto tea / missing size não é produzido aqui.
Uma boa encomenda salta o catch
Dá a size o valor regular. label regressa normalmente. catch não corre.
function label(order) {
if (!order.size) {
throw new Error("missing size");
}
return order.drink + " / " + order.size;
}
try {
console.log(label({ drink: "tea", size: "regular" }));
} catch (error) {
console.log(error.message);
}
O registo é tea / regular.
finally corre nos dois casos
finally corre depois de try quando a chamada tem sucesso, e depois de catch quando lança. Usa-o para um passo que tem de acontecer nos dois casos.
function label(order) {
if (!order.size) {
throw new Error("missing size");
}
return order.drink + " / " + order.size;
}
try {
label({ drink: "tea" });
} catch (error) {
console.log(error.message);
} finally {
console.log("done");
}
Os registos são missing size e depois done. Depois do lançamento, finally escreve done.
Lê o nome e a mensagem
Apanha o mesmo Error e imprime os dois campos em linhas separadas.
try {
throw new Error("missing size");
} catch (error) {
console.log(error.name);
console.log(error.message);
}
Os registos são Error e depois missing size. Assim, error.name é Error e error.message é missing size.
A verificação lança, quem chama apanha
requireSize conhece a regra. Lança e não constrói um rótulo. Quem chama decide o que imprimir.
function requireSize(order) {
if (!order.size) {
throw new Error("missing size");
}
}
try {
requireSize({ drink: "tea" });
console.log("ok");
} catch (error) {
console.log(error.message);
}
O registo é missing size. A linha console.log("ok") não corre, porque o lançamento de requireSize saltou para catch.
A linha por baixo da chávena
A página chama label sem tamanho. catch monta a linha visível a partir da mensagem.
<!DOCTYPE html>
<html>
<body>
<p id="line">…</p>
<script>
function label(order) {
if (!order.size) {
throw new Error("missing size");
}
return order.drink + " / " + order.size;
}
let line = "";
try {
line = label({ drink: "tea" });
} catch (error) {
line = "caught / " + error.message;
}
document.getElementById("line").textContent = line;
</script>
</body>
</html>
A linha lê-se caught / missing size. Uma encomenda completa teria devolvido tea / regular e deixado catch sem uso. fixed / tea / regular era a página de depuração.
No balcão
- Chama
label({ drink: "tea" })dentro detry. O registo do catch é missing size. - Chama
label({ drink: "tea", size: "regular" }). O registo é tea / regular, e o catch não corre. - Acrescenta
finallyà volta da chamada que falha. O segundo registo é done. - Lê
error.nameeerror.message. Os registos são Error e missing size. - Lê a linha da página: caught / missing size.
Falhas no balcão
throw pára a função. console.error não lança e não pára a função.
- Esperar que as linhas depois de
throwcorram - Esquecer
catche deixar o erro por apanhar - Achar que
finallysó corre depois do sucesso - Ler
error.messagecomo o nomeError - Ler a linha como fixed / tea / regular
Fica com isto
throw new Error("missing size")páralabelantes dereturncatchrecebe o Error e imprimeerror.message, que é missing size- Uma encomenda completa regista tea / regular e salta
catch - Depois do lançamento,
finallyescreve done - A linha da página lê-se caught / missing size
🧠 Teste Seu Conhecimento
Teste Seu Conhecimento
Desafie-se com este questionário interativo e veja o quão bem você entende o tópico
📝 Instruções
- Leia cada pergunta cuidadosamente
- Selecione a melhor resposta para cada pergunta
- Você pode refazer o quiz quantas vezes quiser
- Seu progresso será mostrado no topo