首页 >后端开发 >Golang >如何处理 Go 函数中的恐慌和延迟返回?

如何处理 Go 函数中的恐慌和延迟返回?

DDD
DDD原创
2024-11-15 05:35:02376浏览

How to Handle Panics and Defer Returns in Go Functions?

Go 中延迟返回

在 Go 中,defer 语句允许推迟函数的执行,直到周围的函数返回。这允许即使在发生紧急情况时也能执行清理任务,这种情况在运行时发生不可恢复的错误时可能会发生。

考虑以下代码片段,如果函数发生紧急情况,它会尝试从函数返回错误:

func getReport(filename string) (rep report, err error) {
    rep.data = make(map[string]float64)

    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered in f", r)
            err, _ = r.(error)
            return nil, err
        }
    }()
    panic("Report format not recognized.")
    // rest of the getReport function
}

但是,此代码无法按预期工作。 deferred函数内的return语句只是修改了函数内的局部变量err和rep,并没有真正将它们返回到函数外。

为了解决这个问题,我们可以使用deferred函数内的recover函数来检索恐慌值并相应地设置 err 参数。此外,我们应该检查恐慌值的类型,并在必要时将其转换为错误。

这是更新的代码:

defer func() {
    if r := recover(); r != nil {
        fmt.Println("Recovered in f", r)
        switch x := r.(type) {
        case string:
            err = errors.New(x)
        case error:
            err = x
        default:
            err = errors.New("Unknown panic")
        }
        rep = nil
    }
}()

此代码确保 err 参数设置为基于恐慌值的适当错误,并且它还会使rep参数无效以防止返回不完整的报告。

以上是如何处理 Go 函数中的恐慌和延迟返回?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn