【30天熟悉Go语言】10 Go异常处理机制
作者:秃秃爱健身,多平台博客专家,某大厂后端开发,个人IP起于源码分析文章 😋。
源码系列专栏:Spring MVC源码系列、Spring Boot源码系列、SpringCloud源码系列(含:Ribbon、Feign)、Nacos源码系列、RocketMQ源码系列、Spring Cloud Gateway使用到源码分析系列、分布式事务Seata使用到源码分析系列、JUC源码系列
基础系列专栏:30天熟悉GO语言(建设中)
码文不易,如果感觉博主的文章还不错,请点赞👍、收藏 ⭐️支持一下博主哇 🙏
联系方式:Saint9768,加我进技术交流群,一起学习进步📚、freedom✈️🌊
文章目录
- 一、前言
- 二、异常处理
- 1)Go的异常处理机制
- 1、defer关键字
- 2、recover函数
- 3、defer + recover 捕获异常示例
- 2)自定义异常
- 示例
- 3)错误中断程序执行
- 三、总结
一、前言

Go系列文章:
- GO开篇:手握Java走进Golang的世界
- 2 Go开发环境搭建、Hello World程序运行
- 3 Go编程规约和API包
- 4 Go的变量、常量、运算符
- 5 Go 基本数据类型
- 6 Go 复杂数据类型之指针
- 7 Go流程控制之分支结构if、switch
- 8 Go流程控制之循环结构for range、goto、break、continue
- Go函数全方位解析
Go专栏传送链接:https://blog.csdn.net/saintmm/category_12326997.html
二、异常处理
程序出现错误后,会被中断,无法继续执行。
package mainimport "fmt"func main() {testErrorHandle()fmt.Println("test函数执行成功")
}func testErrorHandle() {num1 := 10num2 := 0result := num1 / num2fmt.Println(result)
}
异常输出如下:

我们需要通过错误处理/异常捕获,使程序可以继续执行。
1)Go的异常处理机制
go追求代码优雅,通过defer + recover的方式实现异常处理机制,进而提高程序健壮性。
1、defer关键字
在golang中,程序遇到defer关键字,不会立即执行defer后的语句,而是将defer后的语句压入一个栈中,然后继续执行函数后面的逻辑。在函数执行完毕后,从栈中依次取出defer语句执行。
此外,defer关键字遵守FILO的特性,若多个defer函数在同一函数内,执行顺序遵循先进后出原理。即第一个defer函数最后一个被执行。
2、recover函数
recover是Go语言的内置函数,用于在发生 panic 后进行恢复,当 panic 发生时,程序会立即终止并开始执行对应的 recover 代码块。即:用于捕获函数错误。

3、defer + recover 捕获异常示例
通过recover()函数捕获到了异常,然后defer关键字将异常压入一个栈中,接着继续执行main()函数后面的逻辑,最后执行异常打印出来。
package mainimport "fmt"func main() {testErrorHandle()fmt.Println("test函数执行成功")
}func testErrorHandle() {// 使用defer + recover捕获异常;并直接调用匿名函数defer func() {// 调用recover内置函数捕获错误,如果没有可捕获的错误,recover()函数返回零值:nilerr := recover()if err != nil {fmt.Println("错误被捕获,error is ", err)}}()num1 := 10num2 := 0result := num1 / num2fmt.Println(result)
}
异常捕获:

2)自定义异常
使用需要调用errors包下的New()函数进行自定义异常,但是New()函数仅支持自定义一个字符串。

示例
package mainimport ("errors""fmt"
)func main() {err := customException()if err != nil {fmt.Println("自定义错误为:", err)}fmt.Println("test函数执行成功")
}// 函数的返回类型为error
func customException()(err error) {num1 := 10num2 := 0if num2 == 0 {// 抛出自定义异常return errors.New("除数不能为0")} else {// 正常执行result := num1 / num2fmt.Println(result)return nil}
}
控制台输出:

3)错误中断程序执行
一些场景,我们希望程序出现错误之后,后续代码不再执行,程序中断并退出。
我们可以使用builtin包下的panic()内置函数,中断程序的执行。
示例:
- 当customException()函数返回异常信息之后,panic()函数将中断main()函数的执行。
package mainimport ("errors""fmt"
)func main() {err := customException()if err != nil {fmt.Println("自定义错误为:", err)// 中断程序的执行panic(err)}fmt.Println("test函数执行成功")
}// 函数的返回类型为error
func customException()(err error) {num1 := 10num2 := 0if num2 == 0 {// 抛出自定义异常return errors.New("除数不能为0")} else {// 正常执行result := num1 / num2fmt.Println(result)return nil}
}
控制台输出:

三、总结
Go的异常处理分三块:通过defer关键字 + recover()函数捕获异常、通过errors包下的New()函数自定义异常、通过panic()函数中断程序执行。
相关文章:
【30天熟悉Go语言】10 Go异常处理机制
作者:秃秃爱健身,多平台博客专家,某大厂后端开发,个人IP起于源码分析文章 😋。 源码系列专栏:Spring MVC源码系列、Spring Boot源码系列、SpringCloud源码系列(含:Ribbon、Feign&…...
飞机打方块(四)游戏结束
一、游戏结束显示 1.新建节点 1.新建gameover节点 2.绑定canvas 3.新建gameover容器 4.新建文本节点 2.游戏结束逻辑 Barrier.ts update(dt: number) {//将自身生命值取整let num Math.floor(this.num);//在Label上显示this.num_lb.string num.toString();//获取GameCo…...
保研之旅1:西北工业大学电子信息学院夏令营
💥💥💞💞欢迎来到本博客❤️❤️💥💥 本人持续分享更多关于电子通信专业内容以及嵌入式和单片机的知识,如果大家喜欢,别忘点个赞加个关注哦,让我们一起共同进步~ &#x…...
[WMCTF 2023] crypto
似乎退步不了,这个比赛基本不会了,就作了两个简单题。 SIGNIN 第1个是签到题 from Crypto.Util.number import * from random import randrange from secret import flagdef pr(msg):print(msg)pr(br"""........ …...
图像分割unet系列------TransUnet详解
图像分割unet系列------TransUnet详解 1、TransUnet结构2、我关心的问题3、总结与展望TransUnet发表于2021年,它是对UNet非常重要的改进,专为医学图像分割任务设计,特别用于在医学图像中分割器官或病变等解剖结构。 1、TransUnet结构 TransUNet在U-Net模型的基础上引入了混合…...
ASCII码-shellcode的技巧
网上已经有成熟的工具了,所以就简单记录一下工具怎么用吧 https://github.com/TaQini/alpha3 https://github.com/veritas501/ae64.git https://github.com/rcx/shellcode_encoder 结合题目来看吧,没有开启NX保护,基本这类型题目九成九都…...
spring cloud 之 dubbo nacos整合
整体思路: 搭建本地nacos服务,详见docker安装nacos_xgjj68163的博客-CSDN博客 共三个工程,生产者服务、消费者服务、生产者和消费者共同依赖的接口工程(打成jar,供生产者和消费者依赖); …...
MySQL如何进行表之间的关联更新
在实际编程工作或运维实践中,对MySQL数据库表进行关联更新是一种比较常见的应用场景,比如在电商系统中,订单表里保存了商品名称的信息(冗余字段设计),但如果商品名称发生变化,则需要通过关联商品…...
Docker创建 LNMP 服务+Wordpress 网站平台
Docker创建 LNMP 服务Wordpress 网站平台 一.环境及准备工作 1.项目环境 公司在实际的生产环境中,需要使用 Docker 技术在一台主机上创建 LNMP 服务并运行 Wordpress 网站平台。然后对此服务进行相关的性能调优和管理工作。 容器 系统 IP地址 软件 nginx centos…...
node没有自动安装npm时,如何手动安装 npm
之前写过一篇使用 nvm 管理 node 版本的文章,node版本管理(Windows) 有时候,我们使用 nvm 下载 node 时,node 没有自动下载 npm ,此时就需要我们自己手动下载 npm 1、下载 npm下载地址:&…...
C# 使用递归方法实现汉诺塔步数计算
C# 使用递归方法实现汉诺塔步数计算 Part 1 什么是递归Part 2 汉诺塔Part 3 程序 Part 1 什么是递归 举一个例子:计算从 1 到 x 的总和 public int SumFrom1ToX(int x) {if(x 1){return 1;}else{int result x SumFrom1ToX_2(x - 1); // 调用自己return result…...
窗口函数大揭秘!轻松计算数据累计占比,玩转数据分析的绝佳利器
上一篇文章《如何用窗口函数实现排名计算》中小编为大家介绍了窗口函数在排名计算场景中的应用,但实际上窗口函数除了可以进行单行计算,还可以在每行上打开一个指定大小的计算窗口,这个计算窗口可以由SQL中的语句具体指定,大到整个…...
健康检测智能睡眠床垫方案
《2022中国睡眠质量调查报告》调查结果显示,16%的被调查者存在夜间睡眠时间不足6个小时,表现为24点以后才上床睡觉,并且在6点之前起床;有83.81%的被调查者经常受到睡眠问题困扰,其中入睡困难占2…...
计网第三章(数据链路层)(五)
目录 一、以太网交换机自学习和转发帧的过程 1.两层交换机和三层交换机 2.以太网交换机的基本原理 3.具体实现过程 一、以太网交换机自学习和转发帧的过程 1.两层交换机和三层交换机 大家可能注意到平常做题时有叫两层交换机,或者三层交换机的。 两层交换机就…...
嵌入式系统中常见内存的划分方法
看到有小伙伴在讨论关于单片机内存的话题,今天就结合STM32给大家描述一下常见的划分区域。 在一个STM32程序代码中,从内存高地址到内存低地址,依次分布着栈区、堆区、全局区(静态区)、常量区、代码区,其中全…...
深入理解与实现:常见搜索算法的Java示例
深入理解与实现:常见搜索算法的Java示例 搜索算法在计算机科学中扮演着重要角色,用于在数据集中查找特定元素或解决问题。在本篇博客中,我们将深入探讨图算法的一个重要分支:图的搜索算法。具体而言,我们将介绍图的深…...
PHP自己的框架实现操作成功失败跳转(完善篇四)
1、实现效果,操作成功后失败成功自动跳转 2、创建操作成功失败跳转方法CrlBase.php /**成功后跳转*跳转地址$url* 跳转显示信息$msg* 等待时间$wait* 是否自动跳转$jump*/protected function ok($urlNULL,$msg操作成功,$wait3,$jump1){$code1;include KJ_CORE./tp…...
【汇编语言】CS、IP寄存器
文章目录 修改CS、IP的指令转移指令jmp问题分析 修改CS、IP的指令 理论:CPU执行何处的指令,取决于CS:IP应用:程序员可以通过改变CS、IP中的内容,进行控制CPU即将要执行的目标指令;问题:如何改变CS、IP中的…...
Nvidia Jetson 编解码开发(3)解决H265解码报错“PPS id out of range”
1.问题描述 基于之前的开发程序 Nvidia Jetson 编解码开发(2)Jetpack 4.x版本Multimedia API 硬件编码开发--集成encode模块_free-xx的博客-CSDN博客 通过Jetson Xavier NX 硬编码的H265发出后, 上位机断点播放发出来的H265码流, 会报“PPS id out of range” 错误 …...
Angular中如何获取URL参数?
Angular中的ActivatedRoute中保存着路由信息,可用来提取URL中的路由参数。 constructor(private route: ActivatedRoute){}ngOnInit(): void {this.getUser();}getUser(): void {const id this.route.snapshot.paramMap.get(id);} }route.snapshot是一个路由信息的…...
轴承故障诊断实战:从振动信号到Python代码的完整分析流程
轴承故障诊断实战:从振动信号到Python代码的完整分析流程 在工业设备维护领域,轴承作为旋转机械的核心部件,其健康状态直接影响设备运行效率与安全性。传统的人工巡检方式已难以满足现代工业对故障预警的实时性需求,而基于振动信号…...
Python异步编程避坑:为什么你的‘async with’会报错?手把手教你正确使用aiohttp
Python异步编程避坑指南:深入理解aiohttp的正确打开方式 第一次接触Python异步编程时,很多人都会在async with这个语法上栽跟头。明明照着文档写的代码,运行时却抛出"SyntaxError: async with outside async function"的错误&#…...
python-flask-djangol框架的青少年编程学习平台
目录技术选型与架构设计功能模块划分开发阶段规划安全与扩展性示例代码片段(Flask路由)部署与运维教育适配项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术选型与架构设计 采用Python生态的Flask或D…...
80+经典游戏的现代救赎:WidescreenFixesPack让老游戏焕发新生
80经典游戏的现代救赎:WidescreenFixesPack让老游戏焕发新生 【免费下载链接】WidescreenFixesPack Plugins to make or improve widescreen resolutions support in games, add more features and fix bugs. 项目地址: https://gitcode.com/gh_mirrors/wi/Widesc…...
OpenClaw+ollama-QwQ-32B自动化测试:从用例生成到结果分析
OpenClawollama-QwQ-32B自动化测试:从用例生成到结果分析 1. 为什么选择OpenClaw做测试自动化 作为一个长期与测试代码打交道的开发者,我一直在寻找能够真正减轻重复劳动的解决方案。传统的测试框架虽然成熟,但编写和维护测试用例仍然占据了…...
PUMA560轨迹规划踩坑记:DH参数选错,你的仿真结果还准吗?
PUMA560轨迹规划实战:从DH参数陷阱到精准运动控制 第一次在MATLAB中看到PUMA560机械臂的末端执行器画出诡异的"8"字轨迹时,我盯着屏幕足足愣了三分钟。按照教科书上的标准DH参数编写的代码,理论上应该生成完美的直线运动࿰…...
别再死记硬背了!用Kahn算法搞定LeetCode 207课程表,保姆级C++代码逐行解析
从课程表到任务调度:Kahn算法在LeetCode 207中的实战应用 每次打开LeetCode看到那道课程表问题,你是不是也感到一阵头疼?先修课程、依赖关系、环状检测……这些概念堆在一起,简直比大学选课系统还让人崩溃。但别担心,今…...
嵌入式 数据结构 线性表 学习笔记
线性表线性结构的特点是:1、存在唯一的一个被称作“第一个”的数据元素2、存在唯一的一个被称作“最后一个”的数据元素3、除第一个之外,集合中的每个元素均只有一个前驱4、除最后一个以外,集合中的每个数据元素均只有一个后继顺序表示和实现…...
GCC编译选项详解与工程实践指南
GCC编译选项深度解析与工程实践指南1. 编译选项基础概念1.1 编译过程与选项作用GCC编译过程分为预处理、编译、汇编和链接四个阶段。编译选项通过控制这些阶段的行为,实现不同的编译目标:# 完整编译流程示例 gcc -E main.c -o main.i # 预处理 gcc -S…...
AI写教材必备!高效工具生成低查重教材,节省大量时间
AI教材生成工具评测与介绍 在编写教材前,选择合适的工具简直是一场“挣扎”的过程!如果用普通的办公软件,功能就显得太简单,框架和格式都需要自己一一调整;若选用专门的AI教材写作工具,操作却显得复杂&…...
