Recuperar en Golang

Al igual que el bloque try/catch en excepción en lenguajes como Java , C# , etc., se usa para detectar excepciones de manera similar en el lenguaje Go, la función de recuperación se usa para manejar el pánico. Es una función incorporada que se define en el paquete incorporado del lenguaje Go. El uso principal de esta función es recuperar el control de un Goroutine en pánico. O, en otras palabras, maneja el comportamiento de pánico del Goroutine .

Sintaxis:

func recover() interface{}

Puntos importantes:

  • La función de recuperación siempre se llama dentro de la función diferida, no en la función normal. Si llama a la función de recuperación dentro de la función normal o fuera de la función diferida, entonces la función de recuperación no detiene la secuencia de pánico como se muestra en el Ejemplo 1. Por lo tanto, siempre llame a la función de recuperación dentro de la función diferida porque la función diferida no detiene su ejecución si el programa entra en pánico, entonces la función de recuperación detiene la secuencia de pánico simplemente restaurando la ejecución normal de la gorutina y recupera el valor de error pasado a la llamada de pánico como se muestra en el Ejemplo 2.
  • La función de recuperación solo funciona si llama a la misma rutina en la que se produce el pánico. Si lo llama en una rutina diferente, entonces no funcionará como se muestra en el Ejemplo 3.
  • Si desea encontrar el seguimiento de la pila, utilice la función PrintStack que se define en el paquete de depuración.

Ejemplo 1:

// Go program which illustrates
// the concept of recover
package main
  
import "fmt"
  
// This function is created to handle
// the panic occurs in entry function
// but it does not handle the panic 
// occurred in the entry function
// because it called in the normal
// function
func handlepanic() {
  
    if a := recover(); a != nil {
        fmt.Println("RECOVER", a)
    }
}
  
// Function
func entry(lang *string, aname *string) {
  
    // Normal function
    handlepanic()
  
    // When the value of lang
    // is nil it will panic
    if lang == nil {
        panic("Error: Language cannot be nil")
    }
      
    // When the value of aname
    // is nil it will panic
    if aname == nil {
        panic("Error: Author name cannot be nil")
    }
      
    fmt.Printf("Author Language: %s \n Author Name: %s\n", *lang, *aname)
    fmt.Printf("Return successfully from the entry function")
}
  
// Main function
func main() {
  
    A_lang := "GO Language"
    entry(&A_lang, nil)
    fmt.Printf("Return successfully from the main function")
}

Producción:

panic: Error: Author name cannot be nil

goroutine 1 [running]:
main.entry(0x41a788, 0x0)
    /tmp/sandbox777592252/prog.go:35 +0x180
main.main()
    /tmp/sandbox777592252/prog.go:46 +0x40

Ejemplo 2:

// Go program which illustrates
// the concept of recover
package main
  
import (
    "fmt"
)
  
// This function handles the panic
// occur in entry function
// with the help of the recover function
func handlepanic() {
  
    if a := recover(); a != nil {
      
        fmt.Println("RECOVER", a)
    }
}
  
// Function
func entry(lang *string, aname *string) {
  
    // Deferred function
    defer handlepanic()
  
    // When the value of lang
    // is nil it will panic
    if lang == nil {
      
        panic("Error: Language cannot be nil")
    }
      
    // When the value of aname
    // is nil it will panic
    if aname == nil {
        panic("Error: Author name cannot be nil")
    }
    fmt.Printf("Author Language: %s \n Author Name: %s\n", *lang, *aname)
    fmt.Printf("Return successfully from the entry function")
}
  
// Main function
func main() {
  
    A_lang := "GO Language"
    entry(&A_lang, nil)
    fmt.Printf("Return successfully from the main function")
}

Producción:

RECOVER Error: Author name cannot be nil
Return successfully from the main function

Ejemplo 3:

// Go program which illustrates
// recover in a goroutine
package main
  
import (
    "fmt"
    "time"
)
  
// For recovery
func handlepanic() {
    if a := recover(); a != nil {
        fmt.Println("RECOVER", a)
    }
}
  
/* Here, this panic is not 
   handled by the recover 
   function because of the 
   recover function is not 
   called in the same 
   goroutine in which the 
   panic occurs */
  
// Function 1
func myfun1() {
  
    defer handlepanic()
    fmt.Println("Welcome to Function 1")
    go myfun2()
    time.Sleep(10 * time.Second)
}
  
// Function 2
func myfun2() {
  
    fmt.Println("Welcome to Function 2")
    panic("Panicked!!")
}
  
// Main function
func main() {
  
    myfun1()
    fmt.Println("Return successfully from the main function")
}

Producción:

Welcome to Function 1
Welcome to Function 2
panic: Panicked!!

goroutine 6 [running]:
main.myfun2()
    /tmp/sandbox157568972/prog.go:31 +0xa0
created by main.myfun1
    /tmp/sandbox157568972/prog.go:24 +0xc0

Publicación traducida automáticamente

Artículo escrito por ankita_saini y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *