在GO lang的defer函数中获取panic()参数
我有一个函数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 mainimport (
"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")
以上是 在GO lang的defer函数中获取panic()参数 的全部内容, 来源链接: utcz.com/qa/400523.html