为了账号安全,请及时绑定邮箱和手机立即绑定

如何在发生恐慌的 Go 函数中返回一个值?

如何在发生恐慌的 Go 函数中返回一个值?

Go
拉莫斯之舞 2021-11-15 16:52:46
我的 Go 函数预计会返回一个值,但在调用库函数时可能会发生恐慌。我可以用来recover()在延迟调用中捕获它,但是在这种情况下如何返回值?func MyFunc() string{    defer func() {        if err := recover(); err != nil {            // What do I do to make MyFunc() return a value in case of panic?        }    }()    SomeFuncThatMayPanic()    return "Normal Return Value"    // How can I return "ERROR" in case of panic?}
查看完整描述

1 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

您可以使用命名结果参数。命名您的返回值,并在检测到恐慌时的延迟函数中,您可以更改返回“变量”的值。将返回更改后的新值。


例子:


func main() {

    fmt.Println("Returned:", MyFunc())

}


func MyFunc() (ret string) {

    defer func() {

        if r := recover(); r != nil {

            ret = fmt.Sprintf("was panic, recovered value: %v", r)

        }

    }()

    panic("test")

    return "Normal Return Value"

}

输出(在Go Playground上试试):


Returned: was panic, recovered value: test

这在Spec: Defer statements 中提到:


例如,如果延迟函数是函数文字,并且周围的函数具有在文字范围内的命名结果参数,则延迟函数可以在返回结果参数之前访问和修改结果参数。


博客文章Defer, Panic and Recover 中也提到了这一点:


延迟函数可以读取并分配给返回函数的命名返回值。


并且在Effective Go: Recover 中:


如果发生doParse恐慌,恢复块会将返回值设置为——nil延迟函数可以修改命名返回值。


查看完整回答
反对 回复 2021-11-15
  • 1 回答
  • 0 关注
  • 140 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信