当前位置: 首页 > 知识库问答 >
问题:

如何修改返回值与恐慌和恢复在戈朗[副本]

王波
2023-03-14

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

func foo1() int {

    defer func() {
        if p := recover(); p != nil {
            fmt.Printf("internal error: %v\n", p)
        }
        // how can I do?
    }()

    panic("test error")
    return 10
}

共有1个答案

奚昌胤
2023-03-14

一种方法是在func定义中命名返回值

package main

import "fmt"

func foo() (r int) {
    defer func() {
        if p := recover(); p != nil {
            fmt.Printf("internal error: %v\n", p)
            r = 5 // this modify the return value
        }
    }()

    panic("test error")
    return 3
}

func main() {
    fmt.Println(foo()) // this print 5
}
 类似资料:
  • 有什么方法可以重写panic功能来使用我们的记录器吗?

  • 问题内容: 我的Go函数应该返回一个值,但是在调用库函数时可能会出现紧急情况。我可以在延迟调用中捕获它,但是在这种情况下如何返回一个值? 问题答案: 您可以使用命名结果参数。命名您的返回值,并在检测到紧急情况时在延迟函数中更改返回“变量”的值。更改后的新值将被返回。 例: 输出(在Go Playground上尝试): Spec:Defer语句中 提到了这一点: 例如,如果延迟函数是函数文字,并且周

  • 问题内容: 在defer函数中,我想查看一次恢复调用是否会产生非nil值(不恢复) 可能吗? 问题答案: 那确切的事情是不可能的。您可能只想重新恐慌,就像在其他语言中重新引发异常一样。

  • 问题内容: 我曾经认为,如果goroutine中的恐慌的调用者在恐慌之前完成,它将使其终止程序(延迟恢复没有任何帮助,因为此时还没有发生恐慌), 直到我尝试以下代码: 我发现无论调用者函数完成与否,如果goroutines开始恐慌,调用者的延迟恢复机制将无济于事。整个程序仍然无效。 所以为什么?理论上,调用者功能仍在运行。当出现紧急情况时,调用者的延迟功能应起作用(包括恢复)。 问题答案: 该规范

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