Tratamento de Erros em TypeScript: Técnicas Avançadas de try/catch

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Tratamento de Erros em TypeScript: do try/catch básico aos padrões industriais

\n\n

O tratamento de erros não se resume apenas a blocos try/catch. Em TypeScript, graças ao sistema de tipos rigoroso, podemos elevar o gerenciamento de erros a um nível totalmente novo. Neste artigo, exploraremos técnicas avançadas que ajudarão você a escrever um código mais confiável e previsível.

\n\n

O problema do try/catch padrão em TypeScript

\n\n

O bloco try/catch clássico em TypeScript tem um problema fundamental: o tipo do erro capturado é unknown (ou any em versões antigas). Isso significa que o TypeScript não sabe com qual objeto exatamente estamos lidando.

\n\n
try {\n  // algum código perigoso\n  const result = JSON.parse('{"data": 123}');\n} catch (error) {\n  // error tem o tipo unknown\n  // Não é possível simplesmente chamar error.message\n  console.log(error.message); // Erro de compilação!\n}
\n\n

Isso força os desenvolvedores a ignorar os tipos ou escrever verificações extensas. Vamos ver como resolver esse problema em um nível avançado.

\n\n

1. Criando um sistema de erros personalizados com tipagem

\n\n

Em vez de lançar Error comuns, crie uma hierarquia de erros personalizados. Isso permite que o TypeScript diferencie os tipos de erro em tempo de compilação.

\n\n
// Classe base para todos os erros da aplicação\nclass AppError extends Error {\n  constructor(\n    message: string,\n    public readonly code: string,\n    public readonly statusCode: number = 500\n  ) {\n    super(message);\n    this.name = this.constructor.name;\n  }\n}\n\n// Tipos de erro específicos\nclass ValidationError extends AppError {\n  constructor(message: string) {\n    super(message, 'VALIDATION_ERROR', 400);\n  }\n}\n\nclass NotFoundError extends AppError {\n  constructor(resource: string) {\n    super(`${resource} não encontrado`, 'NOT_FOUND', 404);\n  }\n}\n\nclass DatabaseError extends AppError {\n  constructor(message: string) {\n    super(message, 'DB_ERROR', 500);\n  }\n}\n\n// Uso\nfunction findUser(id: string): User {\n  if (!id) throw new ValidationError('ID é obrigatório');\n  // ... lógica de busca\n  if (!user) throw new NotFoundError('Usuário');\n  return user;\n}
\n\n

2. Type guards para tratamento de erros

\n\n

Para tratar diferentes tipos de erro com segurança, use type guards. Este é um padrão chave para trabalhar com unknown no catch.

\n\n
// Type guard para AppError\nfunction isAppError(error: unknown): error is AppError {\n  return error instanceof AppError;\n}\n\n// Type guard para ValidationError\nfunction isValidationError(error: unknown): error is ValidationError {\n  return error instanceof ValidationError;\n}\n\n// Tratamento avançado\ntry {\n  const user = findUser(userId);\n} catch (error) {\n  if (isValidationError(error)) {\n    // TypeScript sabe que error é ValidationError\n    console.error(`Erro de validação: ${error.message}`);\n    return { status: 400, message: error.message };\n  }\n  \n  if (isAppError(error)) {\n    // error é AppError\n    console.error(`Código do erro: ${error.code}`);\n    return { status: error.statusCode, message: error.message };\n  }\n  \n  // Erro desconhecido\n  if (error instanceof Error) {\n    console.error('Erro desconhecido:', error.message);\n  }\n  \n  return { status: 500, message: 'Erro interno do servidor' };\n}
\n\n

3. Padrão Result (Either monad)

\n\n

Esta é uma alternativa às exceções que torna o tratamento de erros explícito no nível dos tipos. Em vez de lançar um erro, a função retorna um objeto que pode conter um resultado bem-sucedido ou um erro.

\n\n
// Definição de tipos para o padrão Result\ntype Success<T> = { success: true; data: T };\ntype Failure<E> = { success: false; error: E };\ntype Result<T, E> = Success<T> | Failure<E>;\n\n// Funções auxiliares\nfunction success<T>(data:                

Blogs

Book Recommendations