设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间00 现在时间00 缓存数据 对自己狠一点,逼自己努力,再过几年你将会感谢今天发狠的自己、恨透今天懒惰自卑的自己。晚安!

对自己狠一点,逼自己努力,再过几年你将会感谢今天发狠的自己、恨透今天懒惰自卑的自己。晚安!

查看: 509|回复: 1

golang panic 函数用法示例详解

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:230
  • 打卡月天数:0
  • 打卡总奖励:3477
  • 最近打卡:2025-11-19 13:40:06
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
385
主题
366
精华
0
金钱
4667
积分
817
注册时间
2023-1-9
最后登录
2025-11-19

发表于 2025-3-2 16:14:18 | 显示全部楼层 |阅读模式
目录


  • 1. panic 的作用
  • 2. 基本用法
  • 3. recover 的使用规则
  • 4. 错误处理建议
  • 5. 常见错误场景
  • 总结
在 Go 语言中,
  1. panic
复制代码
  1. recover
复制代码
是用于处理运行时异常的关键字。以下是它们的用法总结和示例:

1. panic 的作用


  • 触发条件:当程序遇到无法恢复的严重错误时(如不可预料的逻辑错误、依赖项缺失等),
    1. panic
    复制代码
    会终止当前函数的执行,并逐层向上触发
    1. defer
    复制代码
    ,最后若未被
    1. recover
    复制代码
    捕获,程序会崩溃。
  • 适用场景

    • 初始化阶段的关键资源缺失(如配置文件、数据库连接)。
    • 代码逻辑中出现不可恢复的异常(如断言失败)。


2. 基本用法
  1. package main
  2. import "fmt"
  3. func main() {
  4.     defer func() {
  5.         if r := recover(); r != nil {
  6.             fmt.Println("Recovered from panic:", r)
  7.         }
  8.     }()
  9.     fmt.Println("Start")
  10.     panic("something bad happened") // 触发 panic
  11.     fmt.Println("End") // 不会执行
  12. }
复制代码
输出
  1. StartRecovered from panic: something bad happened
复制代码
3. recover 的使用规则


  • 必须与
    1. defer
    复制代码
    结合:
    1. recover
    复制代码
    只能在
    1. defer
    复制代码
    函数中生效。
  • 仅在当前 goroutine 有效:无法捕获其他 goroutine 的 panic。
  1. func mayPanic() {
  2.     panic("a problem occurred")
  3. }
  4. func main() {
  5.     defer func() {
  6.         if r := recover(); r != nil {
  7.             fmt.Println("Recovered. Error:", r)
  8.         }
  9.     }()
  10.     mayPanic() // 触发 panic
  11.     fmt.Println("After mayPanic()") // 不会执行
  12. }
复制代码
4. 错误处理建议


  • 优先返回
    1. error
    复制代码
    :常规错误应通过多返回值(如
    1. error
    复制代码
    类型)处理。
  • 谨慎使用
    1. panic
    复制代码
    :仅在严重错误或不可恢复场景下使用(如程序启动失败)。
  • 在关键位置
    1. recover
    复制代码
    :例如在 goroutine 的入口或 HTTP 请求处理器中,防止程序崩溃。
Web 服务器示例
  1. func handleRequest() {
  2.     defer func() {
  3.         if err := recover(); err != nil {
  4.             log.Println("Request failed:", err)
  5.         }
  6.     }()
  7.     // 处理请求逻辑(可能触发 panic)
  8. }
复制代码
5. 常见错误场景


  • 未捕获的 panic:若未在
    1. defer
    复制代码
    中调用
    1. recover
    复制代码
    ,程序会崩溃。
  • 跨 goroutine panic:每个 goroutine 需独立处理自己的 panic。

总结


    1. panic
    复制代码
    :用于终止程序执行并传递错误信息。
    1. recover
    复制代码
    :在
    1. defer
    复制代码
    中捕获 panic,恢复程序流程。
  • 最佳实践:优先使用错误返回值,仅在必要时结合
    1. panic
    复制代码
    1. recover
    复制代码

通过合理使用这两个关键字,可以提升程序的健壮性,避免因未处理异常导致的崩溃。
到此这篇关于golang panic 函数用法的文章就介绍到这了,更多相关golang panic 函数内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
19
积分
18
注册时间
2022-12-25
最后登录
2022-12-25

发表于 2025-4-17 12:36:45 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表