Buscar..


Observaciones

Este artículo supone el conocimiento de los conceptos básicos de aplazamiento.

Para el manejo de errores ordinarios, lea el tema sobre el manejo de errores.

Pánico

Un pánico detiene el flujo de ejecución normal y sale de la función actual. Cualquier llamada diferida se ejecutará antes de pasar el control a la siguiente función superior en la pila. La función de cada pila saldrá y ejecutará llamadas diferidas hasta que el pánico se maneje usando un recover() diferido recover() , o hasta que el pánico alcance main() y finalice el programa. Si esto ocurre, el argumento proporcionado para entrar en pánico y un seguimiento de pila se imprimirá en stderr .

package main

import "fmt"

func foo() {
    defer fmt.Println("Exiting foo")
    panic("bar")
}

func main() {
    defer fmt.Println("Exiting main")
    foo()
}

Salida:

Exiting foo
Exiting main
panic: bar


goroutine 1 [running]:
panic(0x128360, 0x1040a130)
    /usr/local/go/src/runtime/panic.go:481 +0x700
main.foo()
    /tmp/sandbox550159908/main.go:7 +0x160
main.main()
    /tmp/sandbox550159908/main.go:12 +0x120

Es importante tener en cuenta que el panic aceptará cualquier tipo como parámetro.

Recuperar

Recuperar como su nombre lo indica, puede intentar recuperarse de un panic . La recuperación debe intentarse en una declaración diferida ya que el flujo de ejecución normal se ha detenido. La instrucción de recover debe aparecer directamente dentro del encierro de la función diferida. No se aceptarán las declaraciones de recuperación en funciones llamadas por llamadas de función diferidas. La llamada recover() devolverá el argumento provisto al pánico inicial, si el programa está actualmente en pánico. Si el programa no tiene pánico actualmente, recover() devolverá nil .

package main

import "fmt"

func foo() {
    panic("bar")
}

func bar() {
    defer func() {
        if msg := recover(); msg != nil {
            fmt.Printf("Recovered with message %s\n", msg)
        }
    }()
    foo()
    fmt.Println("Never gets executed")
}

func main() {
    fmt.Println("Entering main")
    bar()
    fmt.Println("Exiting main the normal way")
}

Salida:

Entering main
Recovered with message bar
Exiting main the normal way


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow