当前位置: 首页 > 面试题库 >

如何在恐慌的Go函数中返回值?

堵雅健
2023-03-14
问题内容

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

问题答案:

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

例:

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语句中 提到了这一点:

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

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

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

有效的Go中:Recover

如果出现doParse紧急情况,恢复块会将返回值设置为— nil延迟函数可以修改命名的返回值。



 类似资料:
  • 我目前正在考虑如何编写测试来检查给定的代码是否出现了恐慌?我知道Go使用来捕捉恐慌,但与Java代码不同的是,您不能真正指定在发生恐慌时应该跳过哪些代码或您有哪些代码。所以如果我有一个函数: 我真的不知道是否发生了恐慌,我们恢复了,或者函数是否根本没有恐慌。如何指定在没有恐慌的情况下跳过哪些代码,以及在出现恐慌的情况下执行哪些代码?我如何检查我们是否从恐慌中恢复过来?

  • 我的Go函数预计会返回一个值,但在调用库函数时可能会出现恐慌。我可以使用在延迟调用中捕获它,但是在这种情况下如何返回值呢?

  • 我有一个问题,如何修改返回值与恐慌和恢复在golang请帮助我,谢谢!

  • 我试图从我的程序中创建的go例程中捕捉崩溃/恐慌,以便将它们发送到我的崩溃错误报告服务器(如Sentry/Raygun) 例如, 做这件事的惯用方法是什么?

  • 我对还很陌生。所以,请把剑给我(如果可能的话)。 我试图通过学习这里的教程从web上获取数据 在问之前,我看了很多参考资料,比如: 博客延迟,恐慌和恢复 在Goroutines中处理恐慌 how-show-i-write-goroutine 还有几个,但我想不通。 以下是你不想去游乐场的代码(原因尚不为人所知): 我将代码修改为(假设)处理goroutine中的错误,如下所示(go-playgro

  • Go语言内置支持多返回值,这个在Go语言中用的很多,比如一个函数同时返回结果和错误信息。 package main import "fmt" // 这个函数的返回值为两个int func vals() (int, int) { return 3, 7 } func main() { // 获取函数的两个返回值 a, b := vals() fmt.Println(a