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 doneExemplo 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 doneExplicaçã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.
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