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!")
}
相关推荐
苏三说技术3 小时前
LangChain4j 和 LangGraph4j,哪个更好?
后端
ServBay4 小时前
7 个AI开发中真正用得上的 MCP Server,配合Claude Code食用效果更佳
后端·claude·mcp
妙码生花4 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十五):优化细节、网络请求封装
前端·后端·ai编程
用户6757049885025 小时前
Go 语言里判断字符串为空,90% 的人都写错了!
后端·go
用户6757049885025 小时前
Go 进阶必修:90% 的人都没用对的“表驱动法”
后端·go
小兔崽子去哪了5 小时前
Java 生成二维码解决方案
java·后端
苍何5 小时前
懂事的 Agent 已经开始自己看屏幕干活了,效率起飞!
后端
掘金码甲哥5 小时前
1分钟买不了吃亏系列: nginx动态域名解析
后端
神奇小汤圆6 小时前
2026大厂Java岗面试记录:八股+场景+项目+AI,一文讲透快速上岸路径(含答案)
后端