Sobes.tech
Middle+

O que é um pânico em Go e quando não pode ser capturado?

sobes.tech IA

Resposta da IA

Em Go, o pânico (panic) é um mecanismo utilizado para lidar com erros críticos durante a execução do programa. Quando uma função panic é chamada, a execução da goroutine atual é interrompida e inicia o processo de "desenrolar" da pilha (stack unwinding), no qual as funções deferidas (defer) são chamadas.

O pânico pode ser capturado com a função recover, que deve ser chamada dentro de uma função deferida. Se recover for chamado fora de uma função deferida, não poderá capturar o pânico.

No entanto, há situações em que o pânico não pode ser capturado:

  • Se o pânico ocorrer na goroutine principal e não for capturado, o programa terminará abruptamente.
  • Se o pânico ocorrer em chamadas de sistema ou no runtime, que não permitem recover.
  • Se recover for chamado fora do contexto de uma função deferida, não poderá impedir que o programa termine.

Exemplo:

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Pânico capturado:", r)
        }
    }()
    panic("algo deu errado")
}

Neste exemplo, o pânico será capturado e tratado, e o programa não terminará abruptamente.