使用 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中文网其他相关文章!