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机滤器:常 ...
随机推荐
- pyqt点击右上角关闭界面但子线程仍在运行
现象: 通过右上角的叉关闭图形界面后,程序运行的子线程却不会被自动关闭,依然留存在系统中 原因: 子线程没有正确关闭 解决方法: 1.将子线程设置成守护线程 self.your_thread = th ...
- IDEA主题下载仓库地址
拿去,不多BB https://plugins.jetbrains.com/search?tags=Theme
- odoo14里面开发一个简单的action.client 的tag 模板例子
1.js模板 web_template.js odoo.define('web', function (require) { "use strict"; var core = r ...
- 面试题|Spring中BeanFactory与ApplicationContext的本质区别和作用
BeanFactory 是Bean工厂,是Spring 框架最核心的接口,它提供了高级IoC 的配置机制.如果说BeanFactory是Spring的心脏,那么应用上下文ApplicationCo ...
- 慢查询导致任务执行hang住
上线上了大半天,原因:因为慢查询了导致跑不出来,后来同事帮忙看了下发现慢查询了,程序hang住了 select * from table where cdate = '2023-02-01' and ...
- SAP STRANS 导出EXCEL
第一次用strans是2014年,第二次就是2017年...最近看到有人在问EXCEL双表头的问题,想着就把STRANS导出EXCEL的方法保存下来吧.方便大家参考. 1.已经记不清到底改做哪些类型的 ...
- 从 DeepSeek 突然爆发,看数据开发的应用市场
在数字化快速发展的当下,人工智能与数据技术不断迭代.近期,DeepSeek 凭借自身技术实力在市场中迅速崛起,为剖析数据开发应用市场提供了视角. DeepSeek 爆发:技术与市场的双重驱动 1.1 ...
- 袋鼠云秋季发布会圆满落幕,AI驱动让生产力数智化
在当今时代,AI 的发展如汹涌浪潮,其速度之快超越了任何历史时期.它以前所未有的迅猛之势,渗入到各个领域的不同场景之中,悄然重塑着商业模式与人们的生活方式. 在 AI 逐渐成为企业基础属性的背景下,袋 ...
- UFT send email
- 五、kernel修改屏幕配置
2.3.修改屏幕配置 2.3.1.配置 gpio 修改 ./rk_linux_sdk/kernel/arch/arm64/boot/dts/rockchip/rk3566-evb2-lp4x-v10. ...