当前位置: 首页 > news >正文

Go 异常处理流程

在 Go 语言中,panicrecover 和 defer 是用于处理异常情况的关键字。它们通常一起使用来实现对程序错误的处理和恢复。

1. defer 语句

defer 用于在函数返回之前执行一段代码。被 defer 修饰的语句或函数会在包含 defer 的函数执行完毕后执行。defer 常用于资源清理、释放锁、关闭文件等操作。

func example() {defer fmt.Println("This will be executed last")fmt.Println("This will be executed first")
}

2. panic 和 recover

  • panic 用于引发运行时错误,导致程序崩溃。
  • recover 用于捕获 panic 引发的错误,并进行处理。
func example() {defer func() {if err := recover(); err != nil {fmt.Println("Recovered from panic:", err)}}()panic("This will cause a panic")
}

3. 示例

  1. 当程序执行到 panic 语句时,它会立即停止当前函数的执行,并开始沿调用堆栈向上执行所有的 defer 语句。
  2. 执行 defer 语句时,将其推迟的函数或语句加入到一个栈中,但并不立即执行。
  3. 当所有的 defer 语句都被执行完毕后,程序会终止当前的函数执行,然后开始执行上一层函数的 defer 语句,以此类推。
  4. 如果在 defer 语句执行的过程中发生了 panic,则 panic 会被引发,但是在引发 panic 之前,会先执行该层级的 defer 语句。
  5. 如果有 recover 函数被调用,它会停止 panic 的传播,并返回传递给 panic 的值。

在 Go 中,一个协程(goroutine)出现 panic 不会直接影响其他协程的正常执行。Go 语言的设计目标之一是实现轻量级的并发,保持协程的独立性。因此,一个协程的 panic 不会波及到其他协程。

当一个协程发生 panic 时,通常会触发一系列的 defer 函数的执行,这提供了一种清理资源或记录日志等操作的机制。然后,Go 运行时系统会停止当前协程的执行,但不会影响其他正在运行的协程。

其他协程会继续执行,而不受 panic 影响。这是由于 Go 使用了处理异常的机制,而不是像传统的错误处理机制那样需要在每个函数中检查错误。在 Go 中,panic 主要用于表示程序遇到无法继续执行的错误情况。

下面是一个简单的例子,演示了一个协程的 panic 不会影响其他协程:

package mainimport ("fmt""sync""time"
)func main() {var wg sync.WaitGroupwg.Add(1)go func() {defer wg.Done()panicExample()}()// 启动另一个协程wg.Add(1)go func() {defer wg.Done()fmt.Println("Another goroutine is running.")}()// 等待所有协程结束wg.Wait()
}func panicExample() {defer func() {if r := recover(); r != nil {fmt.Println("Recovered from panic:", r)}}()fmt.Println("Start of panicExample")time.Sleep(1 * time.Second)panic("Something went wrong!")fmt.Println("End of panicExample") // 不会执行到这里
}

在这个例子中,panicExample 函数中的 panic 不会影响另一个协程的正常执行。虽然一个协程中发生了 panic,但其他协程仍然可以继续执行。

4. 总结

在Go中,runtime包是负责处理Go运行时(runtime)的细节,包括垃圾回收、协程调度等。当出现panic时,runtime包会负责处理这些异常情况。

当程序中出现panic时,Go运行时会按照以下步骤进行处理:

  1. 异常的传播:当一个函数发生panic时,该函数会立即停止执行,并将panic传播到调用它的函数。这个过程会一直向上传播,直到被捕获或程序终止。
  2. 栈的展开(Unwinding):在panic发生时,Go运行时会开始展开调用栈(stack unwinding)。这意味着它会逆序执行当前调用栈中的函数,直到找到一个能够处理panic的函数。
  3. 恢复(Recovery):在展开调用栈的过程中,Go运行时会寻找一个适当的recover函数来捕获并处理panicrecover函数是在当前协程的上下文中执行的,用于捕获并处理当前协程中的panic。如果找到了一个recover函数,并且它成功处理了panic(即没有再次触发panic),则程序会从发生panic的位置开始继续执行。
  4. 如果没有找到适当的recover函数来处理panic,程序将终止执行,并打印出相应的错误信息。

在处理panic时,需要注意以下几点:

  • panic通常表示程序中存在无法恢复的错误,因此应该尽量避免在正常的程序逻辑中使用panic
  • panicrecover是用于处理程序中的异常情况,而不是用于控制程序的正常流程。
  • recover函数只能在协程(goroutine)的执行过程中使用,并且只能捕获当前协程中的panic
  • 当一个协程出现panic时,其它协程不会受到影响,会继续独立执行。

相关文章:

Go 异常处理流程

在 Go 语言中,panic、recover 和 defer 是用于处理异常情况的关键字。它们通常一起使用来实现对程序错误的处理和恢复。 1. defer 语句 defer 用于在函数返回之前执行一段代码。被 defer 修饰的语句或函数会在包含 defer 的函数执行完毕后执行。defer 常用于资源清…...

ubuntu20.04安装tensorRT流程梳理

目标:先跑demo,再学习源码 step1, 提前准备好CUDA环境 安装CUDA,cuDNN 注意,CUDA,cuDNN需要去官网下载.run和tar文件安装,否则在下面step4 make命令会报找不到cuda等的错误,具体安装教程网上…...

数字孪生技术:提升UI交互性与个性化设计

随着数字化时代的到来,数字孪生技术正在逐渐改变我们的生活和工作方式。数字孪生是一种复制现实世界系统或实体的技术,通过创建数字模型来模拟现实世界中的各种行为和事件。这种技术不仅为人们提供了一个全新的视角来看待和解决问题,同时也为…...

外包干了5个月,技术退步明显.......

先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…...

嵌入式常见的几种接口

嵌入式开发中,常见的外设通信接口/协议有SPI,I2C,UART三种,本文先分三个部分对SPI,I2C,UART进行介绍,最后对这三种协议进行比较。 1 SPI 1.1 SPI的简介 SPI(Serial Peripheral …...

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(七)

分页查询、删除和修改菜品 1. 菜品分页查询1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计 1.2 代码开发1.2.1 设计DTO类1.2.2 设计VO类1.2.3 Controller层1.2.4 Service层接口1.2.5 Service层实现类1.2.6 Mapper层 1.3 功能测试1.3.2 前后端联调测试 2. 删除菜品2.1 需求分析…...

Grafana采用Nginx反向代理,部分功能报错‘Origin not allowed’ behind proxy

只有部分功能会有这个提示,比如修改密码啥的,网上找了下,官方找到了答案:https://community.grafana.com/t/after-update-to-8-3-5-origin-not-allowed-behind-proxy/60598 有个回复是这样的: tl:dr: try adding prox…...

请大数据把奥威BI分析工具推给每一个财务!

这个财务指标怎么算?那些数据什么时候能拿到?看完报表,发现某部门上个月的支出涨幅过大,想了解原因怎么办?……财务人,你是不是每个月都把时间消耗在这些事情上了?那你可得快接住这个BI大数据分…...

知乎禁止转载的回答怎么复制做笔记?

问题 对于“禁止转载”的回答,右键复制是不行的,ctrl-c也不行,粘贴之后都是当前回答的标题。稍微看了代码,应该是对copy事件进行了处理。不过这样真的有用吗,真是防君子不防小人,只是给收集资料增加了许多…...

pta找鞍点—C语言

7-13 找鞍点 分数 300 全屏浏览题目 切换布局 作者 C课程组 单位 浙江大学 一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。 本题要求编写程序,求一个给定的n阶方阵的鞍点。 输入格式: 输入第一行给出一个正整数n(1…...

编程零基础算法 | 四、循环和选择结构——1572. 矩阵对角线元素的和

一、题目链接 1572. 矩阵对角线元素的和 二、题目简介 给你两个整数,n 和 start 。 数组 nums 定义为:nums[i] start 2*i(下标从 0 开始)且 n nums.length 。 请返回 nums 中所有元素按位异或(XOR)后…...

ubantu配置网卡ip

1.ifconfig查看网卡 2. vi /etc/network/interfaces auto ens33 # 网卡名 iface ens33 inet static # 注意网卡名 address 192.168.43.10 # 配置ip地址 netmask 255.255.255.0 # 掩码 gateway 192.168.43.1 # 网关 3.重启网卡 ifconfig ens33 down ifco…...

增加F110 付款方式的乱记录

随便记录一下,基本上有这些信息可以了 为了保持PRD与测试机一致的银行代码,需要先在DEV,QAS 改成4 外部给号 主要都是在FBZP 开户行维护-FI12_HBANK/FI12 S4hana 里面有的没有办法在FI12 维护只能去NWBC NWBC:维护银行账户并关联…...

软件系统安全漏洞检测应该怎么做?靠谱的软件安全检测公司推荐

软件系统安全漏洞检测是指通过对软件系统进行全面的、系统化的评估,发现和解决其中可能存在的安全漏洞和隐患。这些安全漏洞可能会被不法分子利用,引发数据泄露、系统瘫痪、信息被篡改等安全问题,给企业造成严重的经济和声誉损失。那么软件系…...

单片机学习12——电容

电容的作用: 1)降压作用: 容抗: Xc 1/2fc 串联分压原理。2100Ω的容量,50Hz的频率,可以得到1.5uF。断电之后,需要串联一个1MΩ的电阻放电。 那是不是可以使用2100欧姆的电阻来代替电容呢&am…...

淘宝平台商品详情平台订单接入说明

一 文档说明 本文档面向对象为电商平台商品详情数据和订单进行管理的第三方开发者或自研商家 二 支持范围 目前API已经支持订单的接单、取消、退单处理等操作。如果您的订单管理需求现有API不能满足,可以联系我们提出API需求。 参数说明 通用参数说明 参数不要乱…...

Linux文件截断命令(truncate head tail dd)

目录 一、truncate功能概述实例(可用于删除文件末尾指定大小的内容) 二、head功能概述实例(可用于删除文件末尾指定大小的内容) 三、tail功能概述:实例(可用于删除文件开头指定大小的内容) 四、…...

Armbian安装python环境和pip国内源

文章目录 安装python环境配置pip为国内源 安装python环境 更新软件包列表: sudo apt update安装 Python 3(通常是最新版本): sudo apt install python3验证 Python 安装是否成功: python3 --version运行上述命令后&…...

宿主Linux——KVM安装Windows7系统

KVM虚拟技术 KVM(Kernel-based Virtual Machine) 是基于Linux内核的开源虚拟化技术,在一台物理机上可同时运行多个虚拟系统。KVM使用硬件虚拟化扩展,例如Intel的VT和AMD的AMD-V,在性能方面更加高效,可提供更好的计算能力和响应速…...

Mysql更新Blob存储的Josn数据

Mysql更新blob存储的Josn数据 记录一次mysql操作blob格式存储的json字符串数据 1、检查版本 -- 版本5.7以上才可以能执行json操作 select version(); 2、创建测试数据 -- 创建测试表及测试数据 CREATE TABLE test_json_table AS SELECT UUID(), {"test1": {"…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...