新闻中心

如何在Golang中使用panic和recover

2025-11-11
浏览次数:
返回列表
答案:panic用于触发异常,recover用于捕获并恢复,二者配合可在defer中处理严重错误。当panic被调用时,函数停止执行并触发defer,若defer中recover被调用且存在panic,则返回panic值,程序恢复执行;否则程序崩溃。常见于库函数保护、初始化失败和Web中间件等场景,但不应替代常规错误处理。每个goroutine需独立处理panic,recover仅在defer中有效。

如何在golang中使用panic和recover

在Golang中,panicrecover 是用于处理严重错误的机制,它们不是常规的错误处理方式(应优先使用 error 返回值),而是在程序遇到无法继续执行的异常情况时提供一种退出或恢复的手段。

理解 panic 的作用

当调用 panic 时,当前函数的执行会停止,并开始触发 defer 函数的执行。如果这些 defer 函数中没有调用 recover,程序会继续向上回溯,直到 goroutine 的栈被完全展开,最终导致整个程序崩溃。

常见触发 panic 的情况包括:

  • 访问越界数组或 slice
  • 向 nil map 写入数据
  • 显式调用 panic("something wrong")

示例:

func examplePanic() {
  panic("oh no, something went wrong!")
  fmt.Println("this won't print")
}

使用 recover 捕获 panic

recover 是一个内置函数,只能在 defer 函数中有效。它能重新获得对 panic 流程的控制,并返回传递给 panic 的值。如果当前 goroutine 没有发生 panic,recover 返回 nil。

典型结构如下:

func safeRun() {
  defer func() {
    if r := recover(); r != nil {
      fmt.Println("Recovered:", r)
    }
  }()
  panic("test panic")
  fmt.Println("this is skipped")
}

在这个例子中,程序不会崩溃,而是打印 "Recovered: test panic",然后继续执行后续代码。

易森网络企业版 易森网络企业版

如果您是新用户,请直接将本程序的所有文件上传在任一文件夹下,Rewrite 目录下放置了伪静态规则和筛选器,可将规则添加进IIS,即可正常使用,不用进行任何设置;(可修改图片等)默认的管理员用户名、密码和验证码都是:yeesen系统默认关闭,请上传后登陆后台点击“核心管理”里操作如下:进入“配置管理”中的&ld

易森网络企业版 0 查看详情 易森网络企业版

实际应用场景

虽然不推荐滥用 panic/recover,但在某些场景下是合理的:

  • 库函数内部保护:防止因用户传入错误参数导致整个程序崩溃,可在公共接口使用 defer+recover 做兜底处理。
  • 初始化失败:如配置加载失败且无法继续运行时,可 panic 并由上层 recover 记录日志。
  • Web 框架中间件:HTTP 服务中,中间件通过 recover 防止某个 handler 的 panic 导致服务器退出。

例如 Gin 框架中的 recovery 中间件就是基于此机制实现的。

注意事项与最佳实践

使用 panic 和 recover 时需注意以下几点:

  • 不要用 recover 替代错误处理。普通错误应通过返回 error 来处理。
  • recover 必须在 defer 函数中调用,直接调用无效。
  • panic 的参数可以是任意类型,但建议使用字符串或 error 类型以便于理解。
  • 在并发环境中,每个 goroutine 需要独立的 defer+recover 机制,主协程的 recover 无法捕获子协程的 panic。

基本模式总结:

func protectedCall() {
  defer func() {
    if err := recover(); err != nil {
      // 处理异常,比如记录日志
      log.Printf("Panic recovered: %v", err)
    }
  }()
  // 可能出错的代码
  mightPanic()
}

基本上就这些。合理使用 panic 和 recover 能提升程序健壮性,但切记它们是“最后手段”。

以上就是如何在Golang中使用panic和recover的详细内容,更多请关注其它相关文章!


# golang  # go  # 内存管理  # 是一个  # 都是  # 如何在  # 可在  # 死锁  # red  #   # 焦作seo网站排名优化  # 企业网站怎么做优化  # 江干区网站推广营销价格  # 泉州网站建设怎么收费的  # 抚顺营销推广厂家  # 兴宾网站建设平台  # 营销推广如何搜索  # 邵阳网站优化注意事项  # 北京海淀王彬seo  # seo检索关键词  # 但在  # 您是  # 在这个  # 是在 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 正确连接J*aScript到HTML实现可点击图片与自定义事件处理  漫蛙2网页版漫画入口 漫蛙漫画在线官方登录  Lar*el DB::listen 事件中的查询执行时间单位解析  极速漫画官方主页网址 极速漫画漫画在线浏览官网链接  漫蛙漫画网页端入口 漫蛙2官方正版漫画站点  J*aScript中赋值与自增运算符的复杂交互与执行机制  免费抖音短视频入口_抖音网页版短视频免费通道  晋江读书网页版在线登录 晋江读书电脑版官网  如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构  如何在 Excel Online 和 Google 表格中更改日期格式  c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析  在Socket.IO连接中实现Access Token自动更新与动态重连  想当下一个《2077》?《心之眼》Steam评价升至"多半好评"  Win11怎么隐藏桌面图标 Win11一键隐藏所有桌面元素及恢复显示  Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南  优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率  微博网页版官方账号登录 微博网页版内容浏览使用指南  优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法  铃兰之剑为这和平的世界希里技能组及加点推荐  PHP中获取MongoDB服务器运行时间(Uptime)的专业指南  三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升  Fabric Mod开发:在1.19.3+版本中正确添加自定义物品并管理物品组  抖音网页版怎么|直播|_抖音网页版开播操作指南  Windows7怎么硬盘安装 Windows7提取ISO镜像到非系统盘并运行setup.exe实现硬盘直装【教程】  冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法  俄罗斯Yandex搜索引擎入口_Yandex官网免登录一键访问  怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】  UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】  PyTorch模型训练准确率不提升:诊断与修复常见指标计算错误  解决Rails应用中内容错位与Turbo警告:meta标签误用导致富文本渲染异常  机器学习中对数变换预测结果的反向还原  解决J*aScript中重复选择项的确认对话框显示问题  c++ 获取系统当前时间 c++时间戳获取方法  PS5 Pro有点优势但不多! 《燕云十六声》PS5平台与PC性能画面对比  大象笔记网页版入口 印象笔记网页版登录入口  Win10桌面图标出现小盾牌怎么办 Win10去除UAC图标教程【解决】  qq游戏网页版直接玩_qq游戏免下载快速入口  Mac怎么使用表情符号_Mac Emoji快捷键面板  Excel如何用迷你图显趋势_Excel用迷你图显趋势【趋势小图】  Go RPC HTTP服务正确实现与常见陷阱解析  抖音创作助手登录入口_抖音创作辅助工具官网直达  Composer如何在生产环境安全地执行composer update  电脑IP地址怎么查 查看本机IP地址的几种方法  J*a如何使用AtomicInteger控制计数_J*a无锁计数器性能分析  Flexbox布局实践:实现粘性导航栏与底部固定页脚  J*aScript中在Map循环中检测并处理空数组元素  在VS Code中配置和运行Dart程序的完整步骤  J*aScript map 方法中处理循环元素为空数组的策略  c++中为什么推荐使用using替代typedef_c++现代化类型别名  微信群消息显示延迟如何解决 微信群消息刷新优化方法 

搜索