go recover

recover是Go语言的内建函数,它用于从panic中恢复,阻止panic继续传播,并返回触发panic的值。如果在非延迟函数或者没有发生panic的情况下调用recover,它将不会有任何效果,即返回nil。

通常,recover需要与defer和panic一起使用。当panic被触发后,defer会保证recover总是被最后调用。如果recover成功地恢复了panic,程序会从触发panic的函数中返回,继续执行其他代码。

Go 复制代码
package main

import "fmt"

func f() {
	defer func() {
		if r := recover(); r != nil {
			fmt.Println("Recovered in f", r)
		}
	}()
	fmt.Println("Calling g.")
	g(0)
	fmt.Println("Returned normally from g.")
}

func g(i int) {
	if i > 3 {
		fmt.Println("Panicking!")
		panic(fmt.Sprintf("%v", i))
	}
	defer fmt.Println("Defer in g", i)
	fmt.Println("Printing in g", i)
	g(i + 1)
}

func main() {
	f()
}

输出:
Calling g.
Printing in g 0
Printing in g 1
Printing in g 2
Printing in g 3
Panicking!
Defer in g 3
Defer in g 2
Defer in g 1
Defer in g 0
Recovered in f 4
相关推荐
巫山老妖3 小时前
从零开发一个掘金自动发布 Skill,并上架 Clawhub
后端
颜酱4 小时前
图的数据结构:从「多叉树」到存储与遍历
javascript·后端·算法
雨中飘荡的记忆4 小时前
零拷贝技术深度解析
后端
uzong5 小时前
十年老员工的项目管理实战心得:有道有术
后端
Victor3566 小时前
MongoDB(31)索引对查询性能有何影响?
后端
Victor3566 小时前
MongoDB(30)如何删除索引?
后端
lizhongxuan7 小时前
多 Agent 协同机制对比
后端
IT_陈寒7 小时前
SpringBoot项目启动慢?5个技巧让你的应用秒级响应!
前端·人工智能·后端
树上有只程序猿8 小时前
2026低代码选型指南,主流低代码开发平台排名出炉
前端·后端
高端章鱼哥8 小时前
为什么说用OpenClaw对打工人来说“不划算”
前端·后端