29.Go异常处理-recover

2024-08-21 03:18
文章标签 go 异常 处理 29 recover

本文主要是介绍29.Go异常处理-recover,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

29.Go异常处理-recover

4. recover

 

运行时panic异常一旦被引发就会导致程序崩溃。这当然不是我们愿意看到的,因为谁也不能保证程序不会发生任何运行时错误。

Go语言为我们提供了专用于“拦截”运行时panic的内建函数——recover。它可以是当前的程序从运行时panic的状态中恢复并重新获得流程控制权。

语法如下:

func recover() interface{} 

注意:recover只有在defer调用的函数中有效。

使用 recover() 函数阻止 panic 导致的程序崩溃,示例如下:

package mainimport "fmt"func TestA()  {fmt.Println("func TestA()")
}func TestB(x int)  {// 设置recover, 防止程序崩溃defer func() {recover()}()var a [10]inta[x] = 111 // 当x为20时候,导致数组越界,产生一个panic, 导致程序崩溃
}func TestC()  {fmt.Println("func TestC()")
}func main() {TestA()TestB(11) // TestB()发生异常,中断程序TestC()
} 

以上程序的运行结果如下:

func TestA()
func TestC() 

通过以上程序,我们发现虽然TestB( )函数会导致整个应用程序崩溃,但是由于在改函数中调用了recover( )函数,所以整个函数并没有崩溃。虽然程序没有崩溃,但是我们也没有看到任何的提示信息,那么怎样才能够看到相应的提示信息呢?

使用 recover() 返回崩溃的错误信息

可以直接打印recover( )函数的返回结果,如下所示:

package mainimport "fmt"func TestA()  {fmt.Println("func TestA()")
}func TestB(x int)  {// 设置recover, 防止程序崩溃defer func() {//recover()//可以打印panic的错误信息fmt.Println(recover())}()var a [10]inta[x] = 111 // 当x为20时候,导致数组越界,产生一个panic, 导致程序崩溃
}func TestC()  {fmt.Println("func TestC()")
}func main() {TestA()TestB(11) // TestB()发生异常,中断程序TestC()
} 

输出结果如下:

从输出结果发现,确实打印出了相应的错误信息。

但是,如果程序没有出错,也就是数组下标没有越界,会出现什么情况呢?

image-20210606002619770

这时输出的是空,但是我们希望程序没有错误的时候,不输出任何内容。

所以,程序修改如下:

image-20210606002749765
package mainimport "fmt"func TestA()  {fmt.Println("func TestA()")
}func TestB(x int)  {// 设置recover, 防止程序崩溃defer func() {//recover()//可以打印panic的错误信息if err := recover(); err != nil{fmt.Println(recover())}}()var a [10]inta[x] = 111 // 当x为20时候,导致数组越界,产生一个panic, 导致程序崩溃
}func TestC()  {fmt.Println("func TestC()")
}func main() {TestA()TestB(1) // TestB()发生异常,中断程序TestC()
}

通过以上代码,发现其实就是加了一层判断。

这篇关于29.Go异常处理-recover的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1091970

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

Thymeleaf:生成静态文件及异常处理java.lang.NoClassDefFoundError: ognl/PropertyAccessor

我们需要引入包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>sp

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法   消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法 [转载]原地址:http://blog.csdn.net/x605940745/article/details/17911115 消除SDK更新时的“

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚