首页 > 后端开发 > Golang > Defer 语句可以用于操作恐慌函数中的返回值吗?

Defer 语句可以用于操作恐慌函数中的返回值吗?

Mary-Kate Olsen
发布: 2024-11-12 17:18:01
原创
848 人浏览过

Can Defer Statements Be Used to Manipulate Return Values in Panicked Functions?

使用 Defer 操作返回值

在 Go 中,defer 语句可用于在周围函数返回后执行函数。即使发生错误,此机制也允许您处理清理任务或执行操作。但是,当尝试从发生紧急情况并包含在 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.")
    // Remaining function code...
}
登录后复制

意图是如果 getReport 函数出现紧急情况,则返回错误。但是,这种方法不起作用,因为延迟函数无法更改周围函数中返回值的数量。相反,它们只能修改现有返回参数的值。

要解决此问题,defer 函数应该修改 err 返回参数,而不是尝试返回新的错误值:

defer func() {
    if r := recover(); r != nil {
        fmt.Println("Recovered in f", r)
        // Find out the exact error type and set err
        switch x := r.(type) {
        case string:
            err = errors.New(x)
        case error:
            err = x
        default:
            err = errors.New("Unknown panic")
        }
        // Invalidate rep
        rep = nil
    }
}()
登录后复制

通过此修改,defer 函数会更新 err 返回参数并将rep 设置为 nil 以指示错误情况。这允许周围的函数返回修改后的错误值。

以上是Defer 语句可以用于操作恐慌函数中的返回值吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板