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!")
}
相关推荐
为何创造硅基生物7 小时前
C语言 结构体内存对齐规则(通俗易懂版)
c语言·开发语言
吃好睡好便好7 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
星寂樱易李7 小时前
iperf3 + Python-- 网络带宽、网速、网络稳定性
开发语言·网络·python
仰泳之鹅7 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
之歆7 小时前
DAY_12JavaScript DOM 完全指南(二):实战与性能篇
开发语言·前端·javascript·ecmascript
姚不倒8 小时前
Go语言进阶:接口、错误处理与并发编程(goroutine/channel/context)
云原生·golang
candyTong8 小时前
Claude Code 的 Edit 工具是怎么工作的
javascript·后端·架构
cen__y9 小时前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git
AI人工智能+电脑小能手9 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
GetcharZp9 小时前
GitHub 2.4 万 Star!D2 正在重新定义程序员画图方式
后端