GO lang中的延迟函数中引入panic()参数 [英] getting panic() argument in defer function in GO lang

查看:122
本文介绍了GO lang中的延迟函数中引入panic()参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个函数A调用函数B,它有时会根据无效数据调用panic。
在函数中推迟函数,我想知道传递给panic()的消息函数B,以便我可以通过网络将错误报告给客户端。





$ func一个(abc数据)结果字符串{
defer func(){
//获取恐慌参数并返回结果。
}

xx = B(abc [0]);
yy = B(abc [1]);
...
}

使用恐慌的原因是为了避免非常大量的

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

,并使代码更易于阅读和维护。

解决方案

例如:

 包主要

导入(
错误
fmt


func A(s字符串)(结果字符串,错误错误){
如果e:= recover(),则推迟func(){
; e!= nil {
switch x:= e。(type){
case error:
err = x
default:
err = fmt.Errorf( %v,x)
}
}
}()

B(s)
returnreturned,nil
}

func B(s string){
switch s {
caseok:
return
casefail:
panic (errors.New(failed))
casefail 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(失败)
fmt.Printf(%q,%T( %#v)\ n,s,err,err)
$ bs,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)
}

Playground






输出:

 returned,< nil>(< nil>)
,* errors .errorString(& errors.errorString {s:failed})
,* errors.errorString(& errors.errorString {s:42})
,运行时。 errorString(整数除零)


I have a function A calling function B which would sometime call panic based on invalid data. In function A defer function, I would like to know the message function B passed to the panic() so that I can report the error in json over the network back to the client.

e.g.

func A( abc data) result string{
  defer func(){
    // get panic args and return result.
  }

  xx = B( abc[0] );
  yy = B( abc[1] );
  ...
}

The reason function B use panic is to avoid a very large amount of

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

in function A and make the code easier to read and maintain.

解决方案

For example:

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)
}

Playground


Output:

"returned", <nil>(<nil>)
"", *errors.errorString(&errors.errorString{s:"failed"})
"", *errors.errorString(&errors.errorString{s:"42"})
"", runtime.errorString("integer divide by zero")

这篇关于GO lang中的延迟函数中引入panic()参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆