在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 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")

以上是 在GO lang的defer函数中获取panic()参数 的全部内容, 来源链接: utcz.com/qa/400523.html

回到顶部