Go: возвращение с отсрочки
Я хочу вернуть ошибку из функции, если она панически (в Go):
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
...
}
Я, кажется, неправильно понял саму концепцию паники и отсрочки. Кто-нибудь может просветить меня?
Ответы
Ответ 1
В отложенной функции вы можете изменить возвращаемые параметры, но вы не можете вернуть новый набор. Поэтому простое изменение того, что у вас есть, заставит его работать.
Есть еще одна проблема с тем, что вы написали, а именно, что вы запустили с помощью string
, но ожидаете error
в своем утверждении типа.
Вот исправление для обоих (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
}
}()
Ответ 2
Посмотри на это
package main
import "fmt"
func iWillPanic() {
panic("ops, panic")
}
func runner() (s string) {
rtnValue := ""
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 rtnValue
}
func main() {
fmt.Println("Return Value:", runner())
}