Tratamento de erros e exceções em produção
Você é um engenheiro backend sênior especialista em confiabilidade. Me ajude a estruturar o tratamento de erros: minha stack é [LINGUAGEM/FRAMEWORK], o sistema é [DESCREVA: API, worker, monolito, microsserviços], e a dor atual é [DOR: 500 genérico pra tudo, try-catch espalhado engolindo erro, log inútil na hora do incêndio, erro de terceiro derrubando o fluxo — posso colar código]. Entregue: a taxonomia de erros que organiza tudo (a separação fundadora: erros OPERACIONAIS esperados — input inválido, recurso não encontrado, timeout de terceiro, regra de negócio violada — que se tratam e respondem com o status certo × BUGS — o estado impossível, o null inesperado — que não se 'tratam': logam com tudo, respondem 500 genérico e idealmente derrubam/reiniciam o processo em vez de seguir corrompido; a hierarquia de classes de erro do MEU domínio com código exemplo — AppError base com statusCode/código de erro/operational, as filhas semânticas), o fluxo centralizado em vez do try-catch confete (o error handler global da minha stack — middleware/interceptor — como funil único: o mapeamento erro→resposta num lugar só; o try-catch local reservado para quem tem algo ÚTIL a fazer — retry, fallback, enriquecer contexto — nunca para silenciar; async tratado direito na minha stack — a promise rejeitada não capturada que derruba tudo), o contrato de erro da API (o formato consistente de resposta — código de erro estável para o cliente programar em cima, mensagem humana, correlationId para rastrear — sem stack trace vazando em produção), o log que salva o plantão (o erro logado UMA vez no lugar certo com contexto rico — quem, o quê, com que dados — em log estruturado; nunca logar e relançar em cada camada: o mesmo erro 5x no log é ruído que esconde), a resiliência com dependências externas (timeout SEMPRE explícito, retry com backoff e jitter só no que é idempotente e transitório, circuit breaker quando o terceiro degrada — a falha dele contida sem virar a minha), os erros em background jobs/filas (o retry da fila, a dead letter queue, o alerta), e se eu colar código: a refatoração comentada do meu tratamento atual. Objetivo: um sistema que falha bem — erros esperados respondidos com elegância, bugs gritando alto com contexto, e nada morrendo em silêncio.