try / catch Tratamento de erros e estreitamento no catch
Última atualização: 2026-10-22
try / catch Tratamento de erros e estreitamento no catch
O tratamento de erros no TypeScript tem dois pontos críticos: a variável err do catch é unknown no modo estrito (o JS pode lançar qualquer valor, então o compilador não ousa assumir Error) e precisa ser estreitada antes de usar .message; e "isto pode lançar erro" é invisível nas assinaturas de tipo. As soluções: estreite unknown com instanceof e, para falhas esperadas, use o padrão Result, codificando sucesso/falha direto no tipo de retorno.
| Grupo | Configuração e Prática |
|---|---|
| Tipo | Sintaxe |
| Modo strict | Não necessário |
ℹ️ Info O editor transpila TypeScript para JavaScript e o executa (sem verificação de tipos); veja a Saída de cada exemplo para o resultado da verificação.
📝 Sintaxe
// 1) estreitamento de unknown
try {
risky();
} catch (err: unknown) {
if (err instanceof Error) console.log(err.message);
else console.log("unknown throw:", err);
}
// 2) padrão Result: um tipo união que expressa sucesso ou falha
type Result<T> = { ok: true; value: T } | { ok: false; error: string };
function attempt<T>(fn: () => T): Result<T> {
try { return { ok: true, value: fn() }; }
catch { return { ok: false, error: "failed" }; }
}
⚙️ Parâmetros
| unknown | O tipo da variável de catch (o padrão no modo estrito): pode conter qualquer coisa, mas precisa ser estreitado antes do uso — daí vem a segurança |
|---|---|
| instanceof | A ferramenta de estreitamento mais comum: após err instanceof Error você obtém .message/.stack; funciona também com classes de erro personalizadas |
| Result<T> | Um tipo de retorno feito à mão: { ok: true; value: T } | { ok: false; error }. Quem chama precisa verificar ok primeiro; cada ramo expõe apenas value ou error |
Retorno:O tipo de retorno do padrão Result é uma união discriminada: value existe apenas quando ok é true, error apenas quando false — a possível falha é codificada no tipo, e quem chama não consegue compilar sem tratar o ramo de falha.
▶ Exemplo
Edite o código abaixo e clique em Testar para ver o resultado transpilado:
Saída:
caught RangeError: not a positive integer: abc
7 0
{"ok":true,"value":42}
failed: invalid input
(Saída de execução após a transpilação; .message só é acessível após o estreitamento por instanceof — tocar em err.message sem isso produz error TS18046)