No desenvolvimento de software, especialmente em linguagens como Go, garantir a estabilidade e a resiliência da aplicação é essencial, especialmente em ambientes de produção.
Uma das funcionalidades controversas do Go é o uso de panic e recover. Apesar de serem recursos poderosos, o uso inadequado deles pode levar a sérios problemas em produção.
Neste post, exploraremos o que são panic e recover, suas implicações e por que você deve evitá-los em ambientes de produção.
O que é panic?
Em Go, panic é uma função que interrompe a execução normal da aplicação, imediatamente propagando um erro até o ponto mais alto da pilha de chamadas (stack). Quando uma função chama panic, a execução da função é interrompida, qualquer função chamada com defer é executada e o programa se encerra (a menos que o panic seja recuperado com recover).
Após o panic ser executado, o estado da aplicação se torna imprevisível. As operações em andamento são interrompidas abruptamente, o que pode resultar em dados corrompidos, recursos não liberados e uma falha total da aplicação.
Esse comportamento pode ser desastroso em produção, onde a continuidade do serviço é crítica.
O que é recover?
Recover é uma função especial que permite capturar um panic em um ponto controlado do código, geralmente dentro de uma função executada com defer.
Ao capturar o panic, o recover impede que a aplicação se encerre, permitindo que o código trate o erro de alguma forma e possivelmente continue a execução.
Quando recover é utilizado, o estado da aplicação pode ser parcialmente restaurado. No entanto, como o panic interrompe a execução do fluxo normal de código, a aplicação pode estar em um estado inconsistente, e retomar a execução pode não ser trivial.
Abaixo, listo alguns dos prós e contras de se usar recover.
Prós:
- Evita o encerramento completo da aplicação: Permite capturar e tratar erros críticos, evitando que a aplicação caia.
- Útil em bibliotecas: Pode ser usado para proteger uma biblioteca contra falhas em código de terceiros.
Contras de usar recover:
- Estado inconsistente: Após capturar um
panic, o estado da aplicação pode ser incerto, dificultando a continuidade segura da execução. - Complexidade aumentada: Introduz complexidade adicional ao código, tornando-o mais difícil de entender e manter.
- Tratamento inadequado de erros: Pode mascarar erros críticos, dificultando a detecção e correção de problemas.
Por que não utilizar panic e recover em produção?
Embora panic e recover tenham seu lugar em Go, seu uso em ambientes de produção é altamente desaconselhado.
O uso de panic pode resultar em falhas abruptas e inesperadas que são difíceis de depurar e podem causar a perda de dados e interrupção dos serviços. Além disso, o uso de recover para capturar panic pode resultar em uma aplicação que continua sendo executada em um estado instável, o que pode ser ainda mais perigoso do que a falha total.
Em produção, a abordagem recomendada é utilizar mecanismos de tratamento de erros apropriados, como o uso do tipo error para retornar e tratar erros de maneira controlada.
O que permite uma gestão de erros mais previsível, além de manter a aplicação em um estado seguro e estável.
Conclusão
O uso de panic e recover deve ser reservado para cenários específicos, como em testes ou para tratar condições absolutamente críticas em que não há outra opção.
Em produção, é fundamental adotar práticas robustas de tratamento de erros que garantam a estabilidade e a confiabilidade da aplicação.
Evitar o uso de panic e recover em produção não só melhora a resiliência do seu software como também facilita a manutenção e a evolução contínua da aplicação.
Até a próxima!
Faça parte da comunidade!
Receba os melhores conteúdos sobre Go, Kubernetes, arquitetura de software, Cloud e esteja sempre atualizado com as tendências e práticas do mercado.
Livros Recomendados
Abaixo listei alguns dos melhores livros que já li sobre GO.



Em um caso que aplicação depende de um acesso ao banco de dados, caso não consiga conectar geralmente é usado um panic para não deixar aplicação iniciar, como ficaria essa situação?
Utilizar o log.Fatal também irá matar sua aplicação, no entanto, seu código será mais fácil de ser testado.
[…] Por que evitar panic e recover em produção […]