原文:https://blog.csdn.net/qq_35240081/article/details/140758441
在 Go 语言中,recover 是一个内建函数,用于从 panic 状态中恢复执行。recover 只能在延迟函数(defer)中使用,如果没有 panic 被触发,recover 返回 nil。本文将详细介绍 recover 函数的使用场景和示例。
recover 函数的基本语法
recover 函数的基本语法如下:
recover() interface{}
1
使用 recover 恢复 panic
recover 函数通常与 defer 和 panic 一起使用,以防止程序崩溃并提供恢复机制。
基本示例
package main
import "fmt"
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("捕获到恐慌:", r)
}
}()
fmt.Println("程序开始")
panic("发生了不可恢复的错误")
fmt.Println("程序结束") // 不会执行
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
在这个例子中,当 panic 触发时,recover 函数捕获恐慌信息,使得程序不会崩溃,并打印 “捕获到恐慌: 发生了不可恢复的错误”。
实际应用中的 recover 使用场景
防止程序崩溃
在一些关键的地方使用 recover 可以防止整个程序崩溃,特别是在服务器程序中。
package main
import "fmt"
func main() {
safeFunction()
fmt.Println("程序继续执行")
}
func safeFunction() {
defer func() {
if r := recover(); r != nil {
fmt.Println("捕获到恐慌:", r)
}
}()
panic("一些错误")
fmt.Println("不会执行到这里")
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
多个 defer 的 recover 使用
多个 defer 的场景中,只有最先被推入栈的 defer 可以捕获 panic。
package main
import "fmt"
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("第一个 defer 捕获到恐慌:", r)
}
}()
defer func() {
if r := recover(); r != nil {
fmt.Println("第二个 defer 捕获到恐慌:", r)
}
}()
panic("触发恐慌")
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
在这个例子中,第二个 defer 中的 recover 无法捕获 panic,因为 panic 被第一个 defer 捕获并处理。
使用 recover 的注意事项
只能在 defer 中使用:recover 必须在延迟函数中使用,否则无法捕获到 panic。
理解 panic 和 recover 的关系:panic 会停止当前函数的执行并开始逐层向上清理调用栈,直到遇到 defer 中的 recover。
适度使用:panic 和 recover 应该用于处理不可恢复的错误,不应滥用来控制正常的程序流程。
示例代码
以下是一个综合示例,展示了如何在不同情况下使用 recover 函数:
package main
import "fmt"
func main() {
// 示例 1: 基本使用
defer func() {
if r := recover(); r != nil {
fmt.Println("捕获到恐慌:", r)
}
}()
fmt.Println("程序开始")
panic("发生了不可恢复的错误")
fmt.Println("程序结束") // 不会执行
// 示例 2: 防止程序崩溃
safeFunction()
fmt.Println("程序继续执行")
// 示例 3: 多个 defer
defer func() {
if r := recover(); r != nil {
fmt.Println("第一个 defer 捕获到恐慌:", r)
}
}()
defer func() {
if r := recover(); r != nil {
fmt.Println("第二个 defer 捕获到恐慌:", r)
}
}()
panic("触发恐慌")
}
func safeFunction() {
defer func() {
if r := recover(); r != nil {
fmt.Println("捕获到恐慌:", r)
}
}()
panic("一些错误")
fmt.Println("不会执行到这里")
}
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
总结
recover 是 Go 语言中的一个强大工具,用于从 panic 状态中恢复执行。理解和正确使用 recover 函数,可以显著提高代码的健壮性和容错能力。希望这篇博客能帮助你更好地理解和使用 Go 语言中的 recover 函数,让你的编程之旅更加顺畅。