tag combo go return panic

go - combo - Ir: regresar del aplazamiento



option tag html5 (2)

Echa un vistazo a esto

package main import "fmt" func iwillpanic() { panic("ops, panic") } func runner() (s string) { rtn_value := "" defer func() { if r := recover(); r != nil { // and your logs or something here, log nothing with panic is not a good idea s = "don''t panic" // modify the return value, and it will return } }() iwillpanic() return rtn_value } func main() { fmt.Println("Return Value:", runner()) }

Quiero devolver un error de una función si entra en pánico (en Ir):

func getReport(filename string) (rep report, err error) { rep.data = make(map[string]float64) defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) err, _ = r.(error) return nil, err } }() panic("Report format not recognized.") // rest of the getReport function, which can try to out-of-bound-access a slice ... }

Parece que no entendí bien el concepto de pánico y diferir. ¿Alguien puede iluminarme?


En una función diferida puede modificar los parámetros devueltos, pero no puede devolver un nuevo conjunto. Entonces, un simple cambio en lo que tienes lo hará funcionar.

Hay otro problema con lo que escribiste, a saber, que has pagado con una string pero estás esperando un error en tu afirmación de tipo.

Aquí hay una solución para ambos ( Play )

defer func() { if r := recover(); r != nil { fmt.Println("Recovered in f", r) // find out exactly what the error was and set err switch x := r.(type) { case string: err = errors.New(x) case error: err = x default: err = errors.New("Unknown panic") } // invalidate rep rep = nil // return the modified err and rep } }()