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

我的 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?

}


拉莫斯之舞
浏览 141回答 1
1回答

隔江千里

您可以使用命名结果参数。命名您的返回值,并在检测到恐慌时的延迟函数中,您可以更改返回“变量”的值。将返回更改后的新值。例子: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延迟函数可以修改命名返回值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go