Por que evitar panic e recover em produção

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.

* indicates required

3 comentários sobre “Por que evitar panic e recover em produção

  1. 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?

Deixe uma resposta