Lidando com Panics com Recover em Golang

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Em Golang, recover é uma função embutida que pode ser usada para recuperar de um panic. Este laboratório testará sua capacidade de usar recover para lidar com panics.

Recover (Recuperação)

A função mayPanic no código fornecido irá entrar em panic quando chamada. Sua tarefa é modificar a função main para recuperar do panic e imprimir a mensagem de erro.

  • Use a função recover para lidar com o panic na função mayPanic.
  • Imprima a mensagem de erro quando um panic ocorrer.
$ go run recover.go
Recovered. Error:
a problem

Aqui está o código completo:

// Go torna possível _recuperar_ de um panic, usando
// a função embutida `recover`. Um `recover` pode
// impedir que um `panic` interrompa o programa e permitir que ele
// continue com a execução.

// Um exemplo de onde isso pode ser útil: um servidor
// não gostaria de travar se uma das conexões do cliente
// apresentar um erro crítico. Em vez disso, o servidor
// gostaria de fechar essa conexão e continuar servindo
// outros clientes. Na verdade, isso é o que o `net/http` do Go
// faz por padrão para servidores HTTP.

package main

import "fmt"

// Esta função entra em panic.
func mayPanic() {
	panic("a problem")
}

func main() {
	// `recover` deve ser chamado dentro de uma função adiada (deferred).
	// Quando a função que o envolve entra em panic, o defer irá
	// ativar e uma chamada `recover` dentro dele irá capturar
	// o panic.
	defer func() {
		if r := recover(); r != nil {
			// O valor de retorno de `recover` é o erro levantado na
			// chamada para `panic`.
			fmt.Println("Recovered. Error:\n", r)
		}
	}()

	mayPanic()

	// Este código não será executado, porque `mayPanic` entra em panic.
	// A execução de `main` para no ponto do
	// panic e retoma no closure adiado.
	fmt.Println("After mayPanic()")
}

Resumo

Neste laboratório, você aprendeu como usar a função recover para lidar com panics em Golang. Ao usar recover, você pode impedir que seu programa trave e continuar executando o código.