panic 是 Go 语言中的一种运行时错误处理机制,用于处理程序中的异常情况。

基本含义

panic 会:

  1. 立即停止当前函数的执行
  2. 开始执行 defer 函数(如果有的话)
  3. 向上传播到调用栈,逐层执行 defer
  4. 如果到达 main 函数,程序会崩溃并退出

语法

panic(interface{})

使用场景

panic 通常用于:

  1. 不可恢复的错误(如数组越界、空指针解引用)
  2. 程序逻辑错误
  3. 初始化失败
  4. 手动触发 panic(不推荐)

示例

1. 自动触发的 panic

func main() {
// 数组越界会触发 panic
arr := []int{1, 2, 3}
fmt.Println(arr[10]) // panic: runtime error: index out of range
}

2. 手动触发 panic

func divide(a, b int) int {
if b == 0 {
panic("除数不能为零")
}
return a / b
}

3. defer 与 panic

func main() {
defer fmt.Println("程序结束")
defer fmt.Println("清理资源") panic("发生错误") fmt.Println("这行不会执行")
}
// 输出:
// 清理资源
// 程序结束
// panic: 发生错误

recover 函数

recover 用于捕获 panic,只能在 defer 函数中使用:

func handlePanic() {
defer func() {
if r := recover(); r != nil {
fmt.Println("捕获到 panic:", r)
}
}() panic("测试 panic")
} func main() {
handlePanic()
fmt.Println("程序继续运行")
}

panic vs log.Fatal

特性 panic log.Fatal
执行 defer 会执行 不会执行
可恢复 可用 recover 不可恢复
程序退出 会退出 会退出
错误信息 打印堆栈信息 只打印错误信息

最佳实践

  1. 避免手动使用 panic,除非是真正的不可恢复错误
  2. 使用 error 返回值处理可预期的错误
  3. 在 defer 中使用 recover 来优雅处理 panic
  4. 在 main 函数或 init 函数中使用 panic 处理初始化错误
func main() {
defer func() {
if r := recover(); r != nil {
log.Printf("程序异常退出: %v", r)
}
}() // 初始化代码
if err := initialize(); err != nil {
panic("初始化失败: " + err.Error())
} // 正常程序逻辑
}

go学习笔记:panic是什么含义的更多相关文章

  1. opencv学习笔记——minMaxIdx函数的含义及用法

    opencv中有时需要对Mat数据需要对其中的数据求取最大值和最小值.opencv提供了直接的函数 CV_EXPORTS_W void minMaxLoc(InputArray src, CV_OUT ...

  2. [Golang学习笔记] 06 程序实体3 类型断言和类型转换

    类型断言: 语法:<目标类型的值>,<布尔参数> := <表达式>.( 目标类型 ) // 安全类型断言<目标类型的值> := <表达式>. ...

  3. go 学习笔记之咬文嚼字带你弄清楚 defer 延迟函数

    温故知新不忘延迟基础 A "defer" statement invokes a function whose execution is deferred to the momen ...

  4. swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  5. redis 学习笔记(6)-cluster集群搭建

    上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...

  6. WeX5学习笔记

    目录 WeX5学习笔记... 1 1.轻松看透WeX5产品能力和技术... 1 2.WeX5可以怎么玩?... 3 一.纯本地App. 3 二.关联一个网站,希望默认就打开某页... 4 三.UI设计 ...

  7. Linux 学习笔记

    Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...

  8. RAC学习笔记

    RAC学习笔记 ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架,Cocoa是苹果整套框架的简称,因此很多苹果框架喜欢以Cocoa结尾. 在学习Re ...

  9. BZOJ 1061: [Noi2008]志愿者招募 [单纯形法]【学习笔记】

    1061: [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3975  Solved: 2421[Submit][Stat ...

  10. Log4j简单学习笔记

    log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...

随机推荐

  1. C#之清除已经注册的事件

    private static void DealA(object sender, UnhandledExceptionEventArgs e) { Console.WriteLine($"E ...

  2. B1002 写出这个数 (20 分)

    描述 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值.这里保证 n 小于 10 100 . 输出格式: 在 ...

  3. 2025 CCPC打铁记

    Day -? 报名参加 \(CCPC\) Day -1 周天比赛,周六签到. 早上依旧是在 \(lyyz\) 打练习赛. 中午 \(12:30\) 上车,结果教练忘了通知我,再加上我把北门认成南门,导 ...

  4. @Transactional嵌套事务失效异常Transaction rolled back because it has been marked as rollback-only

    摘要:注解@Transactional嵌套事务失效,抛出异常ransaction rolled back because it has been marked as rollback-only,解决办 ...

  5. IntelliJ IDEA 设置代码自动补全不区分大小写

    在使用IntelliJ IDEA进行开发时,输入一个关键字时会有提示相关的类和方法名,但是默认是区分大小写的,如何让IDEA不区分大小写呢? IntelliJ IDEA版本:IntelliJ IDEA ...

  6. Java四种引用类型回收时机介绍

       每种编程语言都有操作内存中元素的方式,例如在 C 和 C++ 里是通过指针,而在 Java 中则是通过"引用"(reference).在 Java 中一切都被视作对象,但是我 ...

  7. 「Log」做题记录 2023.8.28-2023.9.24

    \(2023.8.28-2023.9.3\) \(\color{blueviolet}{P3704}\) 莫反. \(\color{limegreen}{P8773}\) ST 表. \(\color ...

  8. k8s gpu共享

    k8s gpu 共享方案 1.配置环境变量实现 通过在POD的启动文件中,配置NVIDIA_VISIBLE_DEVICES的环境变量,指定显卡号.NVIDIA_VISIBLE_DEVICES可配置为具 ...

  9. 树结构Tree

    树结构 平衡顺序二叉树 通过平衡顺序二叉树查数据的时候,也就等同于二分查找的操作 Binary Search 2,3树 二三树 二三树有 node2 和 node3 两种节点,树的规则如图 2-3-4 ...

  10. 【UNIAPP】canvas画布不能绘图片

    已知原因1: 当使用 v-if 时,会失效 解决方法1: 如果需要暂时隐藏可以使用 z-index