Como escrever mensagens de erro claras e úteis
Mensagens de erro são frequentemente ignoradas ou mal escritas, mas são uma das principais formas de comunicação entre o sistema e o usuário — seja ele um desenvolvedor, um operador ou um cliente final. Uma mensagem de erro bem escrita não apenas informa que algo deu errado, mas também orienta sobre como corrigir o problema.
Princípios para mensagens de erro eficazes:
- Seja específico
Evite mensagens genéricas como “Erro desconhecido” ou “Falha no sistema”. Em vez disso, descreva exatamente o que aconteceu:
Ruim: “Erro ao salvar.”
Bom: “Erro ao salvar: o campo ‘email’ está vazio e é obrigatório.” - Inclua contexto relevante
Informe onde ocorreu o erro (arquivo, linha, função, requisição) e quais dados estavam envolvidos, quando seguro e útil. - Ofereça uma ação corretiva
O usuário deve saber o que fazer a seguir. Exemplo:
“O arquivo ‘config.json’ não foi encontrado. Verifique se o arquivo existe no diretório raiz ou execute ‘npm run init’ para gerá-lo.” - Use linguagem clara e acessível
Evite jargões técnicos desnecessários, especialmente em sistemas voltados a usuários finais. Para desenvolvedores, inclua detalhes técnicos, mas organizados de forma legível. - Padronize o formato
Use uma estrutura consistente:[Tipo do erro]: [Descrição] — [Sugestão de ação] - Registre erros internamente, mas exiba mensagens amigáveis externamente
Logs podem conter stack traces e detalhes técnicos; a interface do usuário deve mostrar apenas o necessário para ação, sem expor vulnerabilidades.
O que é TDD (Test Driven Development) e como começar
Test Driven Development (Desenvolvimento Guiado por Testes) é uma prática de engenharia de software na qual os testes são escritos antes do código de produção. O objetivo é garantir que cada funcionalidade seja implementada com base em um requisito verificável, promovendo código mais confiável, modular e de fácil manutenção.
Por que usar TDD?
- Reduz bugs ao forçar o pensamento sobre casos de uso e bordas antes da implementação.
- Melhora o design do código, pois o desenvolvedor é incentivado a escrever unidades pequenas e testáveis.
- Facilita refatorações, pois os testes atuam como rede de segurança.
- Documenta o comportamento esperado do sistema.
Como começar com TDD:
- Escolha uma ferramenta de teste adequada à sua linguagem
Exemplos: JUnit (Java), pytest (Python), Jest (JavaScript), NUnit (.NET). - Comece com um requisito simples
Por exemplo: “Deve retornar ‘Olá, [nome]’ quando o nome for fornecido.” - Escreva um teste que falhe (Red)
Crie o teste antes de qualquer implementação. Ele deve falhar, pois a funcionalidade ainda não existe. - Implemente o mínimo necessário para passar no teste (Green)
Escreva apenas o código suficiente para fazer o teste passar — nada além disso. - Refatore o código, mantendo os testes passando
Melhore a estrutura, remova duplicações, melhore nomes — sem alterar o comportamento. - Repita o ciclo para o próximo requisito
Dica para iniciantes:
Comece com exercícios pequenos (katas), como FizzBuzz ou cálculo de impostos. Isso permite focar na mecânica do TDD sem a complexidade de um sistema real.
Red, Green, Refactor: o ciclo para escrever código melhor
O ciclo Red-Green-Refactor é o coração do TDD. Ele estrutura o fluxo de trabalho do desenvolvedor em três etapas claras, garantindo que o código evolua de forma controlada e sustentável.
1. Red — Escreva um teste que falhe
Nesta fase, você define o comportamento esperado escrevendo um teste automatizado. Como a funcionalidade ainda não existe, o teste deve falhar. Essa falha confirma que o teste é válido e que ele realmente está testando algo que ainda não foi implementado.
Exemplo: Testar se uma função
soma(2, 3)retorna5, quando a função ainda nem foi escrita.
2. Green — Faça o teste passar da forma mais simples possível
Implemente apenas o necessário para que o teste passe. Não se preocupe com elegância ou otimização — foque em fazer funcionar. Pode ser até uma solução “gambiarra”, desde que o teste passe.
Exemplo: Retornar
5diretamente, sem fazer a soma, apenas para validar o fluxo.
3. Refactor — Melhore o código sem alterar o comportamento
Agora que o teste está passando, você pode refatorar: melhorar nomes, extrair métodos, remover duplicações, aplicar padrões, otimizar performance — tudo isso com a segurança de que os testes garantem que o comportamento não foi alterado.
Exemplo: Substituir o retorno fixo por uma operação real de soma:
return a + b;
Benefícios do ciclo:
- Disciplina: Impede que o desenvolvedor pule etapas ou escreva código desnecessário.
- Qualidade incremental: O código evolui em pequenos passos, sempre validado.
- Confiança nas alterações: Refatorações não quebram funcionalidades existentes.
- Foco no essencial: O desenvolvedor implementa apenas o que é necessário para atender ao teste.
Dica prática:
Use ferramentas de execução automática de testes (watch mode) para obter feedback imediato a cada mudança. Isso acelera o ciclo e mantém o foco.
Adotar boas práticas de tratamento de erros e disciplina de testes não apenas previne falhas, mas transforma o processo de desenvolvimento em algo mais previsível, colaborativo e sustentável. Comece pequeno, seja consistente, e os benefícios se acumularão com o tempo.