74/100 Dias de Golang - Panic e Recover
Table of Contents
#
Panic e Recover
Para fechar a tríplice, vamos falar sobre panic
e recover
. O Panic
é uma função que interrompe o fluxo normal de execução do programa e o recover
é uma função que permite capturar um panic e retomar o controle do programa. Ela só funciona dentro de funções defer
.
Veja esse exemplo do panic
:
func dividir(a, b int) int {
if b == 0 {
panic("divisão por zero não é permitida")
}
return a / b
}
Se você rodar e executar essa função, o programa vai dar um erro e encerrar. Será que esse é o comportamento que queremos em uma API? Vamos ver como ficaria essa função tratando o erro com um recover:
func dividirSeguro(a, b int) (resultado int, err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("erro na divisão: %v", r)
}
}()
resultado = dividir(a, b)
return
}
resultado, err := dividirSeguro(10, 0)
if err != nil {
fmt.Printf("Erro capturado: %v\n", err)
} else {
fmt.Printf("Resultado: %d\n", resultado)
}
Claro que esse foi só um exemplo. Essa implementação serve para proteger a aplicação de falhas catastróficas. Temos que usar o panic
e recover
como uma rede de segurança, não como mecanismo principal de tratamento de erros.