Go的panic、defer、recover的关系

Go的panic、defer、recover的关系

前置说明:go 没有 try/catch 机制

  • defer 的作用是无论函数如何退出(正常 return / panic),都确保某些代码运行, 并且defer 只能写在函数内
  • recover() 只是一个普通函数 ,但它有个特殊能力:只有在 defer 中调用时,才能"拦截"当前 goroutine 的 panic

panic 发生时,Go 运行时会做以下事情:

  1. 立即停止当前函数的后续代码执行panic 之后的语句不会跑)。
  2. 开始逆序执行当前 goroutine 栈上所有已注册的 defer 函数(LIFO 顺序)。
  3. 在 defer 函数中,你可以选择:
    • 什么都不做 → panic 继续向上传播,最终程序崩溃。
    • 调用 recover()如果成功,panic 被"吃掉",程序恢复正常执行

🌟 所以:defer 是 panic 传播路径上的"检查站",而 recover 是检查站里的"灭火器"

go 复制代码
package main

import "fmt"

func main() {
	defer fmt.Println("Deferred: cleanup done")
	defer func() {
		fmt.Println("Deferred: logging error")
	}()

	defer func() {
		if err := recover(); err != nil {
			fmt.Println("Recovered from panic:", err)
		}
	}()



	panic("Oops!")
}
相关推荐
九转成圣19 分钟前
Java 性能优化实战:如何将海量扁平数据高效转化为类目字典树?
java·开发语言·json
SmartRadio23 分钟前
ESP32-S3 双模式切换实现:兼顾手机_路由器连接与WiFi长距离通信
开发语言·网络·智能手机·esp32·长距离wifi
laowangpython36 分钟前
Rust 入门:GitHub 热门内存安全编程语言
开发语言·其他·rust·github
我叫汪枫40 分钟前
在后台管理系统中,如何递归和选择保留的思路来过滤菜单
开发语言·javascript·node.js·ecmascript
_.Switch42 分钟前
东方财富股票数据JS逆向:secids字段和AES加密实战
开发语言·前端·javascript·网络·爬虫·python·ecmascript
软件技术NINI42 分钟前
webkit简介及工作流程
开发语言·前端·javascript·udp·ecmascript·webkit·yarn
Brendan_00142 分钟前
JavaScript的Stomp.over
开发语言·javascript·ecmascript
念23443 分钟前
f5 shape分析
开发语言·javascript·ecmascript
苍穹之跃1 小时前
某量JS逆向
开发语言·javascript·ecmascript
思茂信息1 小时前
CST软件如何进行参数化扫描?
运维·开发语言·javascript·windows·ecmascript·软件工程·软件需求