Assíncrono · unidade 22 de 27

Erros assíncronos

Tratar um erro é tomar uma decisão, não apagá-lo.

9 min de leitura · 7 cards · 16 exercícios

Card 1 de 7: Erros assíncronos01 / 07

Leitura

Propagação, try/catch/finally, rejeições não tratadas, erros customizados e retry seletivo em fluxos assíncronos.

No backend, esse fundamento aparece quando o código transforma entrada em decisão. O detalhe de linguagem deixa de ser acadêmico no momento em que altera um payload, uma regra de negócio ou a forma como uma falha chega à camada seguinte.

A forma mais útil de estudar é ligar a sintaxe a um contrato observável: o que entra, o que pode mudar, qual resultado sai e qual erro deve continuar o fluxo. É esse raciocínio que os exemplos e exercícios desta unidade procuram treinar.

Código

exemplo.js
try {
  return await saveOrder(order)
} catch (error) {
  throw new Error("falha ao salvar pedido", {
    cause: error,
  })
}

O que fica

  • Throw dentro de uma função async produz uma Promise rejeitada.
  • Toda Promise criada deve ser aguardada, retornada ou tratada.
  • Retry exige limite e deve distinguir falhas transitórias de permanentes.

Prática guiada.Leia, rode, quebre e explique cada exercício.

Prática guiada / unidade 22

Um problema de cada vez.

Leia o contrato, escreva sua tentativa e confira os casos esperados. A resolução de referência permanece visível ao final de cada exercício.

Fundamentalexercício 01 / 16

propagateRejection(promise)

01 / Entenda

Enunciado

await a promise; se ela resolver, retorne o valor. Se ela rejeitar, capture o erro e relance um novo Error cuja mensagem inclua a mensagem original (erro "enriquecido" com mais contexto), sem perder a informação original.

02 / Implemente

Sua tentativa

Comece pela assinatura e resolva sem olhar a resposta.

ponto de partida
async function propagateRejection(promise) {
  // Escreva sua solução aqui.
}

03 / Preveja

Entrada e saída

Use estes exemplos para entender o contrato antes de programar.

Entrada / chamada

propagateRejection(Promise.reject(new Error("falha original")))

Erro esperado

lança /falha original/

04 / Teste

Prove que funciona

O teste chama sua função e compara o resultado real com o esperado.

Como utilizar este teste

  1. 01Implemente a função usando exatamente o nome e os parâmetros do enunciado.
  2. 02Salve sua implementação em exercises.js, na mesma pasta do teste.
  3. 03Abra o terminal nessa pasta e execute o comando abaixo.
  4. 04Se falhar, compare “esperado” com “recebido”; essa diferença mostra o caso que precisa ser corrigido.
node --test --test-name-pattern="propagateRejection" exercises.test.js

Comportamentos cobertos

  • retorna o valor normalmente em caso de sucesso
  • relança com mensagem enriquecida em caso de erro
Ver código completo do teste
test("propagateRejection: retorna o valor normalmente em caso de sucesso", async () => {
  const result = await propagateRejection(Promise.resolve(42));
  assert.equal(result, 42);
});

test("propagateRejection: relança com mensagem enriquecida em caso de erro", async () => {
  await assert.rejects(
    () => propagateRejection(Promise.reject(new Error("falha original"))),
    /falha original/,
  );
});

Ainda travou?

Dicas graduais

Nível 1 — direção, sem código

Para propagateRejection: "enriquecer" um erro significa criar um novo Error cuja mensagem menciona a mensagem original — como você acessa a mensagem de um erro capturado num catch?

Nível 2 — pista mais direta

propagateRejection:

try {
  return await promise;
} catch (err) {
  throw new Error(`falha ao processar: ${err.message}`);
}

05 / Compare

Resolução

Esta área permanece livre em todos os exercícios. O código atual da unidade aparece abaixo para comparação com os testes e casos esperados.
código disponível
async function propagateRejection(promise) {
  throw new Error("not implemented: propagateRejection");
}