Carregando...

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.

Apanhar um tamanho em falta

javascript
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.

Uma encomenda completa

javascript
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.

finally depois de um throw

javascript
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.

Nome e mensagem

javascript
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.

Separar a verificação

javascript
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.

Demo da página — um erro apanhado

html
<!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

  1. Chama label({ drink: "tea" }) dentro de try. O registo do catch é missing size.
  2. Chama label({ drink: "tea", size: "regular" }). O registo é tea / regular, e o catch não corre.
  3. Acrescenta finally à volta da chamada que falha. O segundo registo é done.
  4. Lê error.name e error.message. Os registos são Error e missing size.
  5. 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 throw corram
  • Esquecer catch e deixar o erro por apanhar
  • Achar que finally só corre depois do sucesso
  • Ler error.message como o nome Error
  • Ler a linha como fixed / tea / regular

Fica com isto

  • throw new Error("missing size") pára label antes de return
  • catch recebe o Error e imprime error.message, que é missing size
  • Uma encomenda completa regista tea / regular e salta catch
  • Depois do lançamento, finally escreve done
  • A linha da página lê-se caught / missing size

🧠 Teste Seu Conhecimento

Pronto para Começar

Teste Seu Conhecimento

Desafie-se com este questionário interativo e veja o quão bem você entende o tópico

❓
5
Perguntas
🎯
70%
Para Passar
♾️
∞
Tempo
🔄
∞
Tentativas

📝 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