我的 Go 函数预计会返回一个值,但在调用库函数时可能会发生恐慌。我可以用来recover()在延迟调用中捕获它,但是在这种情况下如何返回值?func MyFunc() string{ defer func() { if err := recover(); err != nil { // What do I do to make MyFunc() return a value in case of panic? } }() SomeFuncThatMayPanic() return "Normal Return Value" // How can I return "ERROR" in case of panic?}
1 回答
隔江千里
TA贡献1906条经验 获得超10个赞
您可以使用命名结果参数。命名您的返回值,并在检测到恐慌时的延迟函数中,您可以更改返回“变量”的值。将返回更改后的新值。
例子:
func main() {
fmt.Println("Returned:", MyFunc())
}
func MyFunc() (ret string) {
defer func() {
if r := recover(); r != nil {
ret = fmt.Sprintf("was panic, recovered value: %v", r)
}
}()
panic("test")
return "Normal Return Value"
}
输出(在Go Playground上试试):
Returned: was panic, recovered value: test
这在Spec: Defer statements 中提到:
例如,如果延迟函数是函数文字,并且周围的函数具有在文字范围内的命名结果参数,则延迟函数可以在返回结果参数之前访问和修改结果参数。
博客文章Defer, Panic and Recover 中也提到了这一点:
延迟函数可以读取并分配给返回函数的命名返回值。
并且在Effective Go: Recover 中:
如果发生doParse恐慌,恢复块会将返回值设置为——nil延迟函数可以修改命名返回值。
- 1 回答
- 0 关注
- 140 浏览
添加回答
举报
0/150
提交
取消