Médio TypeScript
Tratamento de erros tipados com classe personalizada
Enunciado
Crie uma classe NotFoundError que estende Error. Implemente uma função async findItem(id: number): Promise<string> que lança NotFoundError se id for maior que 100, e retorna "Item [id]" caso contrário. No bloco catch, trate especificamente NotFoundError e outros erros separadamente.
Requisitos
- A classe
NotFoundErrordeve tername = "NotFoundError"e uma mensagem personalizada. - A função
findItemdeve serasynce retornarPromise<string>. - O
catchdeve verificarinstanceof NotFoundErrore exibir mensagem adequada. - Para outros erros, exibir uma mensagem genérica.
Código inicial
class NotFoundError extends Error {
// complete
}
async function findItem(id: number): Promise<string> {
// complete
}
async function main() {
// teste com id válido e inválido
}
main();
Saída esperada
Item 42
Erro: Item 200 não encontrado
Ver dica
No catch, use error instanceof NotFoundError para diferenciar. Lembre-se de que error é unknown por padrão.
Mostrar solução
class NotFoundError extends Error {
constructor(message: string) {
super(message);
this.name = "NotFoundError";
}
}
async function findItem(id: number): Promise<string> {
if (id > 100) {
throw new NotFoundError(`Item ${id} não encontrado`);
}
// Simula busca assíncrona
await new Promise((resolve) => setTimeout(resolve, 50));
return `Item ${id}`;
}
async function main(): Promise<void> {
try {
const item = await findItem(42);
console.log(item);
await findItem(200); // lança NotFoundError
} catch (error: unknown) {
if (error instanceof NotFoundError) {
console.error(`Erro: ${error.message}`);
} else {
console.error("Erro inesperado:", error);
}
}
}
main();
Passo a passo
- Definimos
NotFoundErrorestendendoErrore configuramosnamepara identificação. findItemverifica seid > 100e lançaNotFoundErrorcom mensagem personalizada.- Se o id for válido, aguardamos 50ms e retornamos a string.
- No
main, chamamosfindItem(42)e imprimimos o resultado. - Chamamos
findItem(200)dentro do mesmotry, o que dispara o erro. - No
catch, usamosinstanceof NotFoundErrorpara tratar especificamente esse erro e exibir a mensagem. - Caso seja outro erro, exibimos uma mensagem genérica.
Por que funciona
O try/catch captura erros lançados por funções assíncronas quando usamos await. Como error é unknown, precisamos de um type guard (instanceof) para acessar message com segurança. A classe personalizada permite distinguir erros de domínio de erros inesperados, mantendo o código robusto e legível.
Erros comuns
- Não estender
Errorcorretamente:class NotFoundError { ... }não será capturado como erro. - Esquecer
this.name = "NotFoundError"— a propriedadenamefica como"Error", dificultando a identificação. - Acessar
error.messagesem verificar o tipo:console.log(error.message)gera erro de compilação porqueerroréunknown. - Não usar
awaitao chamarfindItem(200): o erro não será capturado pelotry/catche se tornará uma rejeição não tratada.
Outra forma de resolver
Usar uma união discriminada de erros em vez de classes:
type AppError = { type: "not_found"; message: string } | { type: "unknown"; error: unknown };
Essa abordagem é preferível quando você quer evitar classes e prefere tipos puramente estruturais.
Saída esperada
Item 42
Erro: Item 200 não encontrado