"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como lidar com o pânico nas rotinas Go: entendendo o escopo da recuperação?

Como lidar com o pânico nas rotinas Go: entendendo o escopo da recuperação?

Publicado em 2024-11-10
Navegar:697

How to Handle Panics in Go Routines: Understanding Recover Scope?

Tratamento de pânico nas rotinas Go

Go fornece os recursos internos panic() e activate() para gerenciar erros inesperados e condições fatais em código em execução. Para lidar com pânicos em uma rotina Go, é essencial entender o escopo de retrieve().

Entendendo o escopo de retrieve()

recover() só pode se recuperar de pânicos dentro da mesma goroutine que gerou o pânico. Se ocorrer um pânico em uma goroutine sem recuperação ativa (), todo o programa irá travar.

Exemplo com tratamento de erros incorreto

O exemplo de código fornecido na pergunta falha ao lidar com um pânico porque recuperar() é definido na rotina principal, enquanto o pânico é gerado na goroutine handle(). Como resultado, recuperar() não pode acessar o valor de pânico.

func main() {
    // ...

    go handle(done)
    // ...
}

func handle(done chan int64) {
    // ...
    fmt.Println(*a) // Panic here
    done 

Exemplo com tratamento correto de erros

Para lidar com pânicos gerados em uma goroutine, coloque o retrieve() dentro da própria goroutine.

func main() {
    // ...

    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered")
        }
    }()

    go handle(done)
    // ...
}

func handle(done chan int64) {
    // ...
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered")
        }
    }()

    fmt.Println(*a) // Panic here
    done 

Explicação

Neste exemplo corrigido,recover() agora está dentro da goroutine handle(), para que possa capturar o pânico gerado pela desreferenciação do ponteiro nulo. O pânico é então recuperado e a mensagem "Recuperado" é impressa.

Compreender o escopo de retrieve() é crucial para o tratamento eficaz de erros nas rotinas Go. Sempre coloquerecover() dentro da mesma goroutine onde o pânico pode ocorrer para lidar e relatar normalmente quaisquer condições inesperadas.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3