首页 > 其他分享 >(转)探索 Go 语言的内建函数 recover

(转)探索 Go 语言的内建函数 recover

时间:2024-10-14 17:32:10浏览次数:7  
标签:defer fmt Println 内建函数 func Go recover panic

原文: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 函数,让你的编程之旅更加顺畅。

标签:defer,fmt,Println,内建函数,func,Go,recover,panic
From: https://www.cnblogs.com/liujiacai/p/18464670

相关文章

  • 代码江湖:快问快答 -【Golang】
    Golang筑基期1.Go语言的应用场景和优势有哪些?2.Go的数据类型有哪些?如何声明变量?3.如何定义和使用函数?支持哪些参数和返回值类型?4.什么是数组和切片?它们之间有什么区别?5.Go中的map是什么?如何创建和使用map?6.如何使用控制结构(if、for、switch)进行流程控制?7.什......
  • POLIR-Goverment-Taxation:税收-Receipt:发票-真伪查询:https://inv-veri.chinatax.go
    1.查询网址:https://inv-veri.chinatax.gov.cn/发票代码:旧版发票上有发票代码,一并输入。普票,只需要输入发票号码开票日期开具金额(不含税)验证码增值税专用发票,同上图示:......
  • django异步情况下执行orm操作
    importasynciofromchannels.dbimportdatabase_sync_to_asyncfrom.modelsimportConversationclassLlmConsumer(AsyncWebsocketConsumer):def__init__(self,*args,**kwargs):super().__init__(args,kwargs)self.chat_id=None......
  • django实现sse接口
    基于django来实现sse最近在实现通过post调用三方的接口得到sse流数据,并且自己需要用拿到的数据用sse流在返回给前端fromrest_framework.viewsimportAPIViewfromdjango.httpimportStreamingHttpResponse,JsonResponseclassChatMessageViewSet(APIView):defpost......
  • 虚拟定位软件:AnyGo for Mac 6.9.5 特别版
    AnyGo是一款由iAnyGo开发的地理位置虚拟化软件,主要用于在移动设备上模拟位置。它广泛应用于游戏、社交媒体和其他需要定位的应用场景中,用户可以通过它自由更改GPS定位,从而实现在不同地理位置间的移动。主要功能:虚拟定位:用户可以手动选择任意地点进行虚拟定位,非常适合......
  • 第三节:MongoDB聚合操作和索引详解
    一.        二.        三.         !作       者:Yaopengfei(姚鹏飞)博客地址:http://www.cnblogs.com/yaopengfei/声     明1:如有错误,欢迎讨论,请勿谩骂^_^。声     明2:原创博客请在转载......
  • Django后台任务调度
    目录1.Celery安装与使用:2.Django-Q特点:安装与使用:3.DjangoBackgroundTasks安装与使用:4.Django-Crontab安装与使用:总结Django提供了几种常用的后台任务调度和执行解决方案。你可以选择根据你的项目需求来实现后台任务,比如定时任务、延时任务、或队列任务。以下是一些常用的......
  • 2024-10-13:用go语言,给定一个二进制数组 nums,长度为 n, 目标是让 Alice 通过最少的行动
    2024-10-13:用go语言,给定一个二进制数组nums,长度为n,目标是让Alice通过最少的行动次数从nums中拾取k个1。Alice可以选择任何索引aliceIndex,如果对应的nums[aliceIndex]是1,Alice会拾取一个1并将其设为0。之后,Alice可以选择以下两种行动之一:将一个0变为1(最多执行maxCh......
  • 公司订餐系统小程序(Python+Django+lw+系统源码 +调试)
    摘  要随着我国经济的高速发展与人们生活水平的日益提高,人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下,人们更趋向于足不出户解决生活上的问题,菜品信息展现了其蓬勃生命力和广阔的前景。与此同时,为解决用户需求,教室预约发展愈发多元化与网络化,与电子信......
  • 【开题报告】基于django+vue敬老院管理系统(论文+源码)计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着社会的快速发展和人口老龄化的加剧,敬老院作为老年人生活照护的重要场所,其管理效率和服务质量日益受到关注。传统的敬老院管理模式往往......