go学习笔记:panic是什么含义
panic
是 Go 语言中的一种运行时错误处理机制,用于处理程序中的异常情况。
基本含义
panic
会:
- 立即停止当前函数的执行
- 开始执行 defer 函数(如果有的话)
- 向上传播到调用栈,逐层执行 defer
- 如果到达 main 函数,程序会崩溃并退出
语法
panic(interface{})
使用场景
panic
通常用于:
- 不可恢复的错误(如数组越界、空指针解引用)
- 程序逻辑错误
- 初始化失败
- 手动触发 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 | 不可恢复 |
程序退出 | 会退出 | 会退出 |
错误信息 | 打印堆栈信息 | 只打印错误信息 |
最佳实践
- 避免手动使用 panic,除非是真正的不可恢复错误
- 使用 error 返回值处理可预期的错误
- 在 defer 中使用 recover 来优雅处理 panic
- 在 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是什么含义的更多相关文章
- opencv学习笔记——minMaxIdx函数的含义及用法
opencv中有时需要对Mat数据需要对其中的数据求取最大值和最小值.opencv提供了直接的函数 CV_EXPORTS_W void minMaxLoc(InputArray src, CV_OUT ...
- [Golang学习笔记] 06 程序实体3 类型断言和类型转换
类型断言: 语法:<目标类型的值>,<布尔参数> := <表达式>.( 目标类型 ) // 安全类型断言<目标类型的值> := <表达式>. ...
- go 学习笔记之咬文嚼字带你弄清楚 defer 延迟函数
温故知新不忘延迟基础 A "defer" statement invokes a function whose execution is deferred to the momen ...
- swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- redis 学习笔记(6)-cluster集群搭建
上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...
- WeX5学习笔记
目录 WeX5学习笔记... 1 1.轻松看透WeX5产品能力和技术... 1 2.WeX5可以怎么玩?... 3 一.纯本地App. 3 二.关联一个网站,希望默认就打开某页... 4 三.UI设计 ...
- Linux 学习笔记
Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...
- RAC学习笔记
RAC学习笔记 ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架,Cocoa是苹果整套框架的简称,因此很多苹果框架喜欢以Cocoa结尾. 在学习Re ...
- BZOJ 1061: [Noi2008]志愿者招募 [单纯形法]【学习笔记】
1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 3975 Solved: 2421[Submit][Stat ...
- Log4j简单学习笔记
log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...
随机推荐
- 单服务器高性能模式:Reactor 与Proactor
极客时间:<从 0 开始学架构>:单服务器高性能模式:Reactor 与Proactor 1.引言 单服务器高性能的 PPC 和 TPC 模式,它们的优点是实现简单,缺点是都无法支撑高并发 ...
- 异步之舞:Motor驱动与MongoDB的CRUD交响曲
title: 异步之舞:Motor驱动与MongoDB的CRUD交响曲 date: 2025/05/19 15:30:10 updated: 2025/05/19 15:30:10 author: c ...
- C++用Mutex实现读写锁
近期答辩完成了,想回头看看之前没做过的2PL. 实现2PL有4种方式: 死锁检测.本篇是为了做这个而实现的,做这个事情的原因是c++标准库的shared_mutex无法从外界告知获取锁失败. 如果需要 ...
- joomla4/5设置媒体管理可以上传word/pdf/zip/excel文档
在默认情况下,如果需要在joomla媒体管理上传word,excel,zip文档会提示不支持的文件类型如图: 解决方案 我们需要进行设置.点击媒体组件右上角的选项按钮,进入到设置页面. 在设置页面里设 ...
- 雷池WAF磁盘空间告急?手把手教你轻松清理
一.为什么磁盘会满?--了解空间去哪了 雷池WAF在保护你的网站时,会持续记录各种安全数据.主要占用空间的有两大"仓库": 防护日志仓库(数据库) ● 存放内容:攻击记录.人机验证 ...
- C# WinForms 实现打印监听组件
一.组件简介 打印监听组件是一款集成于 Windows 桌面环境的打印任务管理与监控工具,适用于企业级应用场景.它不仅支持多打印机任务的实时监控,还能通过 WebSocket 与外部系统集成,实现自动 ...
- ATM1.0面条版test
[一]功能概要 [1]注册 [2]登陆 [3]取款 [4]存款 [5]查看流水 [6]查看银行信息(查看自己的卡号.余额) [7]初始化银行信息 [8]退出 [二]功能需求 [1]注册 (1)身份信息 ...
- Windows 的桌面图标没有显示正确
Windows系统会缓存桌面图标,如果缓存文件损坏,可能会导致图标不显示.我们可以通过以下步骤重建图标缓存: 打开"任务管理器",结束"Windows资源管理器" ...
- Java--连接池和分页
连接池 分析: 涉及频繁的连接的打开.关闭,影响程序的运行效率! 连接管理: 预先创建一组连接,有的时候每次取出一个: 用完后,放回: 学习连接池: a. 自定义一个连接池 b. 学习优秀的连接池组件 ...
- 【工厂和策略设计模式妙用】解决接口选择与多重if-else 问题
利用工厂和策略模式解决接口选择与多重if-else问题 在软件开发中,我们经常会遇到需要根据不同的条件选择不同实现的情况.传统的if-else或switch-case方式虽然直观,但随着业务逻辑复杂度 ...