go语言recover函数

在Go语言中,recover 是一个内置函数,它用于从由 panic 引发的程序崩溃中恢复。当一个函数在执行过程中调用了 panic,程序的正常控制流会立即中断,并开始逐层向上(即向调用栈的顶部)传递恐慌(panic)。这个过程中,如果某个函数定义了延迟执行的代码(通过 defer 关键字),这些延迟执行的代码会在函数退出之前运行。在延迟执行的函数中调用 recover 可以捕获到传递中的恐慌,并阻止程序崩溃。

recover 的工作原理如下:

在正常的执行路径中调用 recover 会返回 nil,表示没有恐慌被捕获。

如果在延迟执行的函数中(即 defer 语句指定的函数)调用 recover,它可以捕获到从当前函数到调用栈顶部之间任意位置发生的恐慌,并返回引发恐慌的值。

一旦 recover 成功捕获到恐慌,程序的执行会继续从延迟执行的函数之后继续,但不再向调用栈的更高层传递恐慌。

使用 recover 的典型场景是在编写中间件、错误处理逻辑或需要确保某些资源总是被释放时。例如,在 Web 服务器或 API 服务的处理函数中,如果某个操作失败并触发了 panic,你可以使用 recover 来捕获这个恐慌,并向客户端返回一个合适的错误响应,而不是让整个服务器崩溃。

下面是一个简单的例子,展示了如何使用 recover 来捕获和处理恐慌:

go 复制代码
package main
 
import (
	"fmt"
)
 
func safeDivide(a, b float64) (float64, error) {
	defer func() {
		if r := recover(); r != nil {
			fmt.Println("Recovered from panic:", r)
		}
	}()
 
	if b == 0 {
		panic("division by zero")
	}
 
	return a / b, nil
}
 
func main() {
	result, err := safeDivide(10, 0)
	if err != nil {
		// 注意:在这个例子中,我们并没有显式地设置 err,因为 panic 被 recover 捕获了。
		// 在实际应用中,你可能需要定义一个自定义的错误类型或通过其他方式来表示错误。
		fmt.Println("Error occurred:", err) // 这行不会打印,因为 err 是 nil
	} else {
		// 这行也不会打印,因为 panic 阻止了正常返回结果。
		// 但由于我们使用了 recover,程序不会崩溃,并且会继续执行到这里。
		fmt.Println("Result:", result)
	}
 
	// 你可以在这里添加额外的逻辑来处理 panic 后的情况,比如记录日志、返回默认结果等。
	fmt.Println("Program continues after panic recovery.")
}

注意:在上面的例子中,safeDivide 函数并没有显式地返回一个错误(err),因为 panic 被 recover 捕获了,并且我们没有设置 err 的值。在实际应用中,你可能需要定义一个自定义的错误类型,或者在捕获到 panic 后通过其他方式来表示错误的发生。此外,由于 recover 阻止了 panic 的正常传播,因此 safeDivide 函数之外的调用者不会看到 panic 引发的错误。这意味着你需要自己处理错误情况,并确保程序的其余部分能够正确地响应这些错误。

相关推荐
Hello--_--World2 分钟前
Js面试题目录表
开发语言·javascript·ecmascript
聆风吟º2 分钟前
【C标准库】深入理解C语言strcmp函数:字符串比较的核心用法
c语言·开发语言·库函数·strcmp
Moe4883 分钟前
Spring AI(1.1.0):消息元数据
java·后端·面试
用户3721574261354 分钟前
Python 实现 Word 转 HTML 的三种方法
后端
AI进阶客栈4 分钟前
AI 幻觉与 RAG 技术详解:原理 + Spring Boot + pgvector 实战教程
人工智能·spring boot·后端
Fanfanaas8 分钟前
Linux 进程篇 (四)
linux·运维·服务器·开发语言·c++·学习
Sylvia-girl9 分钟前
C++中类与对象
开发语言·c++
良木生香12 分钟前
【C++初阶】:泛型编程的代表作---C++初阶模板
c语言·开发语言·数据结构·c++·算法
掘金者阿豪15 分钟前
AI视频生成大模型大战:Happy Horse 硬刚 Doubao Seedance,1秒1块钱的视频时代来了
后端
掘金者阿豪16 分钟前
程序员破防现场:Codex 配置自定义 AI API 后,Token 为什么烧得这么快?我的血汗钱啊!
后端