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!")
}
相关推荐
阳光是sunny7 小时前
LangGraph中的Reducer是什么
前端·人工智能·后端
灯澜忆梦7 小时前
GO_并发编程---定时器
开发语言·后端·golang
阳光是sunny7 小时前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
-银雾鸢尾-8 小时前
C#中的StringBuilder相关方法
开发语言·c#
皮皮林5518 小时前
开源实力派,给本地 AI 装上深度调研能力,一张 3090 跑到 95.7 分!
后端
-银雾鸢尾-8 小时前
C#中结构体与类的区别;抽象类与接口的区别
开发语言·c#
努力的小雨8 小时前
把 Windows 桌面图标做成一个会自己运转的小世界
后端
武子康9 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端
大模型码小白9 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司10 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求