Golang se recupere

Golang se recupere
A função de recuperação de Golang é usada para recuperar uma goroutina de um pânico. Pense nisso como um bloco de tentativa/captura em outras linguagens de programação. Podemos usar o método de recuperação para recuperar o programa de um erro levantado por um método de pânico. Isso nos ajuda a lidar graciosamente erros em caso de erros, em vez de encerrar o programa.

Vamos explorar como podemos usar o método de recuperação para recuperar um programa de um pânico.

Golang Método de recuperação

O método de recuperação é um método interno que é definido no pacote interno embutido. A sintaxe da função é como mostrado:

func recuper () interface

Para implementar a função de recuperação adequadamente, as seguintes condições devem ser atendidas:

  1. Sempre chame a função de recuperação dentro de uma função diferida. Isso ocorre porque os métodos adiados para não terminar no caso de pânico. Isso os torna capazes de recuperar o programa quando um pânico ocorre. Verifique nosso tutorial sobre Golang Panic para saber mais.
  2. O método de recuperação OS aplicável apenas em uma goroutina que encontra um pânico. Se chamado em uma goroutina que não experimenta o pânico, a recuperação não funciona.

Exemplo 1

O exemplo abaixo ilustra como usar o método de recuperação.

Pacote principal
importar "fmt"
func panic_me ()
pânico ("desperdiçado!")

func main ()
adiar func ()
se rec: = recuperar (); gravando != nil
fmt.Println ("whew!, Estou salvo ")

()
panic_me ()
fmt.Println ("Eu não posso correr")

No exemplo acima, criamos uma função que entra em pânico. Dentro da função principal, criamos uma função de adiamento que tenta recuperar o programa. Se a recuperação for sucesso, ele imprime uma mensagem dentro do bloco if.

Se executarmos o programa acima, devemos obter uma saída como mostrado:

$ go run recuperar.ir
Ufa!, Estou salvo

Observe que a mensagem dentro do bloco principal não é executada. Isso ocorre porque a função principal é destruída imediatamente após o pânico. Somente o método diferido pode ser executado após um pânico.

Exemplo 2

O exemplo abaixo também ilustra como recuperar um programa de um índice esgotado.

Pacote principal
importação (
"FMT"
"Runtime/Debug"
)
func DontPanic ()
se rec: = recuperar (); gravando != nil
fmt.Println ("Eu quase morri")

depurar.PrintStack ()

func getValue (slice [] int, index int)
se índice> (len (slice) - 1)
pânico ("Acesso ao índice ilegal!")

fmt.Println (slice [índice])

func main ()
SLC: = [] int 1, 2, 3
adiar o Dontpanic ()
getValue (SLC, 5)

No exemplo acima, criamos uma função que lida com o pânico usando o método de recuperação e imprime o rastreamento da pilha usando a depuração.Método PrintStack ().

Agora, se tentar acessar um elemento com um índice fora de limite, o método de recuperação lida com o pânico.

O código acima deve retornar um erro como:

Eu quase morri
Goroutine 1 [Running]:
Runtime/Debug.Pilha()
C:/Arquivos de programas/go/src/runtime/debug/pilha.GO: 24 +0x65
Runtime/Debug.PrintStack ()
C:/Arquivos de programas/go/src/runtime/debug/pilha.GO: 16 +0x19
principal.não entrar em pânico()
recuperar.GO: 15 +0x6a
pânico (0XA54b20, 0XA861B8)
C:/Arquivos de programas/go/src/runtime/pânico.GO: 1038 +0x215
principal.getValue (0xc0000cdf50, 0xc0000cdf70, 0x9c52b9, 0x60)
recuperar.GO: 19 +0x98
principal.principal()
recuperar.GO: 33 +0x7E

Os acima representam o rastreamento da pilha à medida que o programa entra em pânico.

Conclusão

Neste artigo, abordamos como recuperar um programa de um pânico usando o método de recuperação. Também aprendemos a obter o rastreamento da pilha se um programa entrar em pânico usando o Debug.Método Panic ().