0

我有一个函数 A 调用函数 B,它有时会根据无效数据调用恐慌。在函数 A 的 defer 函数中,我想知道传递给 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 使用 panic 的原因是为了避免大量

err := B(abc)
if err != nil {
    ...
}

在函数 A 中,并使代码更易于阅读和维护。

4

2 回答 2

4

例如:

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")
于 2013-08-15T15:21:27.327 回答
0

你想要的是recover功能。你想推迟它是对的 - 恢复只在延迟函数中正常工作(如果你在主体中调用它,如果没有恐慌,它将返回 nil ,或者在发生恐慌时被跳过)。Recover 返回在空接口中出现恐慌的值:

func A(abc data) result string {
    defer func() {
        p := recover() // p is an interface{} value, and will be nil if there was no panic
    }() // You have to call the function
    ...
}
于 2013-08-15T15:20:07.673 回答