Pular para o conteúdo principal

victorstein.dev

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.