如何在golang中捕获堆栈溢出错误

时间:2016-08-05 22:00:09

标签: go stack-overflow

有没有办法在golang中捕获堆栈溢出错误?目前我正在使用go recover()做这个工作(下面的代码片段),看起来像堆栈溢出错误无法捕获。

defer func() {
            if x := recover(); x != nil {
                log.Error("In recover, cought error====================", x)
            }
        }()

fn(xxx)

4 个答案:

答案 0 :(得分:8)

您在输出中看到的是“致命错误”,而不是恐慌。

fatal error: stack overflow

您只能使用recover()从恐慌中恢复。堆栈溢出是运行时抛出的致命错误,导致进程打印堆栈跟踪并退出。

答案 1 :(得分:1)

在Golang中,有两种错误传播方式,一种是返回错误,这种错误主要是与功能相关的非致命错误。另一个是恐慌,它通过函数调用堆栈传播直到进程结束或直到达到恢复

恐慌是一个内置函数,可以阻止普通的控制流并开始恐慌。当函数F调用panic时,F的执行停止,F中的任何延迟函数都正常执行,然后F返回其调用者。对于呼叫者,F然后表现得像是对恐慌的呼唤。进程继续向上移动,直到当前goroutine中的所有函数都返回,此时程序崩溃。可以通过直接调用恐慌来启动恐慌。它们也可能由运行时错误引起,例如越界数组访问。

恢复是一个内置功能,可以重新控制恐慌goroutine。恢复仅在延迟函数内有用。在正常执行期间,对recover的调用将返回nil并且没有其他效果。如果当前goroutine处于恐慌状态,则对恢复的调用将捕获给予恐慌的值并恢复正常执行。

如果你想忽略一个恐慌,你可以调用recover并检查恐慌信息,看看恐慌信息是否属于 ok 要忽略的预期类型< / p>

您可以这样做

//RecoverPanic recovers from panic given the message String
//if no message string is given it recovers from all panics
//Example:
//  defer RecoverPanic("stack overflow")
//The above satatement recovers any function from panic that happen
//due to stackoverflow
func RecoverPanic(msg string) {
        if r := recover(); r != nil {
                if msg != "" {
                        if r != msg {
                                panic(r)
                        }
                }
        }
}

在此之后,您可以在函数调用开始时调用

funtion foo(){
    defer RecoverPanic("stack overflow")
    ......
}

有时候恐慌无法被打乱,例如由于内存不足而无法尝试分配内存而感到恐慌,因为处理自身的功能可能会因为没有而感到恐慌用于保存数据的内存

答案 2 :(得分:0)

我认为JimB是最好的答案。如果您有外部库抛出此错误,则需要:

A-针对该库发送PR进行修复。 B-创建您自己的库版本,没有错误。

我强烈建议您在将任何外部库集成到代码中之前,使用单元测试和基准测试它,以检查它是否是可部署的库。

顺便说一句:我正在创建一种有关Golang开发的视频,我真的很想就您应该涵盖的主题发表您的看法。如果愿意,您可以完成 this form ,让我知道您想要涵盖的内容!

Feed。

答案 3 :(得分:-1)

通过恐慌和恢复,您可以捕获golang中的错误

相关问题