Assíncrono · unidade 22 de 27
Erros assíncronos
Tratar um erro é tomar uma decisão, não apagá-lo.
01 / 07Use as setas do teclado ou deslize
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
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.
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.
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
- 01Implemente a função usando exatamente o nome e os parâmetros do enunciado.
- 02Salve sua implementação em
exercises.js, na mesma pasta do teste. - 03Abra o terminal nessa pasta e execute o comando abaixo.
- 04Se falhar, compare “esperado” com “recebido”; essa diferença mostra o caso que precisa ser corrigido.
node --test --test-name-pattern="propagateRejection" exercises.test.jsComportamentos 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
async function propagateRejection(promise) {
throw new Error("not implemented: propagateRejection");
}