Golang recover的使用
1、recover 概述
在 Go 语言中,recover() 函数用于从 panic 中恢复程序的控制流。recover() 通常用于防止程序在遇到 panic 时立即终止,而是允许程序执行一些清理操作或继续执行。具体来说,recover() 有以下作用:
捕获 panic: 当 recover() 函数在 defer 中被调用时,它会捕获当前的 panic,并返回 panic 的值。如果没有 panic,recover() 返回 nil。
避免程序崩溃: 通过结合 recover() 和 defer,你可以防止 panic 导致程序崩溃。这样,即使在函数执行期间发生了 panic,程序仍然可以继续执行后续的代码而不会立即终止。
进行清理工作: 你可以使用 recover() 来执行一些清理工作,例如关闭文件、释放资源等。这是因为即使发生 panic,recover() 也可以让你有机会在函数返回之前执行必要的清理操作。
以下是一个简单示例,演示了如何使用 recover() 来处理 panic:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | func main() { defer func () { if r := recover(); r != nil { fmt.Println( "发生了 panic:" , r) // 在这里可以执行一些清理操作 } }() // 模拟一个引发 panic 的情况 panic( "这是一个 panic" ) // 这里的代码将不会被执行,因为上面的 panic 已经终止了程序的正常流程 fmt.Println( "这段代码不会被执行" ) } |
在这个示例中,defer
和 recover()
用于捕获并处理 panic
,使程序能够继续执行。注意,recover()
必须在 defer
函数内部调用才能生效。
2、示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | package main import "fmt" func testa() { fmt.Println( "111111111111111" ) } func testb(x int) { //设置recover,recover只能放在defer后面使用 defer func () { //recover() //可以打印panic的错误信息 //fmt.Println(recover()) if err := recover(); err != nil { //产生了panic异常 fmt.Println(err) } }() //别忘了(), 调用此匿名函数 var a [10]int a[x] = 111 //当x为20时候,导致数组越界,产生一个panic,导致程序崩溃 } func testc() { fmt.Println( "333333333333333" ) } func main() { testa() testb(20) //当值是1的时候,就不会越界,值是20的时候,就会越界报错。 testc() } |
执行结果:
1 2 3 | 111111111111111 runtime error: index out of range //值越界 333333333333333 |
分类:
Golang
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2017-08-30 Centos 设置zookeeper开机自启动
2017-08-30 使用pssh进行并行批量操作
2017-08-30 JStorm集群的部署
2017-08-30 Centos 集群配置SSH免登陆脚本
2017-08-30 CentOS忘记普通用户密码解决办法