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("这段代码不会被执行")
}

在这个示例中,deferrecover() 用于捕获并处理 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
posted @   人艰不拆_zmc  阅读(716)  评论(0编辑  收藏  举报
编辑推荐:
· .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忘记普通用户密码解决办法
点击右上角即可分享
微信分享提示