(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
...
}
私はパニックと延期という概念そのものを誤解しているようです。誰でも私を啓発できますか?
遅延関数では、返されたパラメーターを変更できますが、新しいセットを返すことはできません。ですから、あなたが持っているものに簡単な変更を加えるだけで機能します。
あなたが書いたことには別の問題があります。つまり、あなたは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
}
}()
これを見てください
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())
}