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
}
}()