Tratamento de Erros
Aprenda a lidar com erros em TypeScript usando try/catch, tornando seus programas mais confiáveis e previsíveis.
Até agora, nossos programas assumem que tudo vai funcionar perfeitamente. Na realidade, erros acontecem: uma operação pode receber um valor inválido, um dado pode estar em formato inesperado, uma leitura pode falhar.
Saber lidar com erros é parte essencial de escrever código profissional.
Dois tipos de erros
Erros de compilação (TypeScript)
Detectados antes de rodar o código. Aparecem no seu editor com sublinhado vermelho.
let nome: string = 42; // Erro: Type 'number' is not assignable to type 'string'O TypeScript te protege desses antes mesmo de executar.
Erros de execução (runtime)
Só aparecem quando o programa está rodando. TypeScript não consegue detectá-los com antecedência.
const dados: string | null = null;
console.log(dados.toUpperCase()); // Erro em tempo de execução: Cannot read properties of nullO bloco try/catch
A estrutura try/catch permite tentar executar um código e, caso ele lance um erro, capturá-lo e responder de forma controlada — sem travar o programa.
try {
// Código que pode gerar um erro
} catch (erro) {
// O que fazer se um erro acontecer
}Exemplo prático:
function dividir(a: number, b: number): number {
if (b === 0) {
throw new Error("Divisão por zero não é permitida.");
}
return a / b;
}
try {
const resultado = dividir(10, 0);
console.log("Resultado:", resultado);
} catch (erro) {
if (erro instanceof Error) {
console.log("Ocorreu um erro:", erro.message);
}
}
// Saída: Ocorreu um erro: Divisão por zero não é permitida.O programa não trava — captura o erro e continua funcionando.
O throw: lançando seus próprios erros
Use throw new Error(mensagem) para sinalizar que uma função recebeu dados inválidos:
function calcularIdade(anoNascimento: number): number {
const anoAtual = new Date().getFullYear();
if (anoNascimento > anoAtual) {
throw new Error("Ano de nascimento não pode ser no futuro.");
}
return anoAtual - anoNascimento;
}
try {
console.log(calcularIdade(2090));
} catch (erro) {
if (erro instanceof Error) {
console.log("Erro:", erro.message);
}
}
// Saída: Erro: Ano de nascimento não pode ser no futuro.O bloco finally
O finally executa sempre — com erro ou sem. Útil para ações de limpeza:
try {
console.log("Tentando executar...");
throw new Error("Algo deu errado");
} catch (erro) {
if (erro instanceof Error) {
console.log("Erro capturado:", erro.message);
}
} finally {
console.log("Isso sempre executa.");
}
// Tentando executar...
// Erro capturado: Algo deu errado
// Isso sempre executa.Tipando erros em TypeScript
Dentro de um catch, o tipo de erro é unknown. Por isso, sempre verifique antes de acessar propriedades:
try {
// ...
} catch (erro) {
if (erro instanceof Error) {
console.log(erro.message); // Seguro: TypeScript sabe que é um Error
} else {
console.log("Erro desconhecido:", erro);
}
}Quando usar try/catch?
Use quando o erro é uma possibilidade real de execução — não um bug que você deveria corrigir. Exemplos: validar entrada do usuário, operações com valores que podem ser inválidos, interação com recursos externos.
Não envolva tudo em try/catch. Isso esconde erros que você deveria encontrar e corrigir.
Para praticar
Crie uma função analisarTexto(texto: string) que:
- Lance um erro se o texto for uma string vazia
- Retorne um objeto
{ palavras: number, caracteres: number }contando palavras e caracteres - Chame a função dentro de um
try/catche trate o erro adequadamente
Clique para ver uma possível solução
interface AnaliseTexto {
palavras: number;
caracteres: number;
}
function analisarTexto(texto: string): AnaliseTexto {
if (texto.trim() === "") {
throw new Error("O texto não pode estar vazio.");
}
return {
palavras: texto.trim().split(/\s+/).length,
caracteres: texto.length,
};
}
try {
const resultado = analisarTexto("Olá, mundo!");
console.log("Palavras:", resultado.palavras);
console.log("Caracteres:", resultado.caracteres);
} catch (erro) {
if (erro instanceof Error) {
console.log("Erro:", erro.message);
}
}Com try/catch e throw, você tem controle sobre o que acontece quando as coisas dão errado. Esse hábito distingue código que funciona apenas em cenários ideais de código que funciona no mundo real.