我有一个函数A调用函数B,该函数有时会基于无效数据来调用恐慌。在函数A的延迟函数中,我想知道传递给panic()的消息函数B,以便可以通过网络将json中的错误报告给客户端。
例如
func A( abc data) result string{ defer func(){ // get panic args and return result. } xx = B( abc[0] ); yy = B( abc[1] ); ... }
函数B使用恐慌的原因是为了避免大量的
err := B(abc) if err != nil { ... }
在函数A中,并使代码更易于阅读和维护。
例如:
package main import ( "errors" "fmt" ) func A(s string) (result string, err error) { defer func() { if e := recover(); e != nil { switch x := e.(type) { case error: err = x default: err = fmt.Errorf("%v", x) } } }() B(s) return "returned", nil } func B(s string) { switch s { case "ok": return case "fail": panic(errors.New("failed")) case "fail miserably": panic(42) default: a, b := 1, 0 if a/b != 0 { panic("ouch") } } } func main() { s, err := A("ok") fmt.Printf("%q, %T(%#v)\n", s, err, err) s, err = A("fail") fmt.Printf("%q, %T(%#v)\n", s, err, err) s, err = A("fail miserably") fmt.Printf("%q, %T(%#v)\n", s, err, err) s, err = A("") fmt.Printf("%q, %T(%#v)\n", s, err, err) }
操场
输出:
"returned", <nil>(<nil>) "", *errors.errorString(&errors.errorString{s:"failed"}) "", *errors.errorString(&errors.errorString{s:"42"}) "", runtime.errorString("integer divide by zero")