浅谈defer、panic、recover 三者的用法

简介: 浅谈defer、panic、recover 三者的用法

1 Go的异常处理机制的引入

go的异常是一个interface类型

type error interface {
   Error() string
}
复制代码

并且是可输出的

func methodA() {
   var err error
   fmt.Println(err)
}
func main() {
   methodA()
}
复制代码

网络异常,图片无法展示
|


但是我们一般用panic函数进行捕获

func methodA() {
   var err error
   fmt.Println(err)
   panic(err)
   fmt.Println(err)
}
func main() {
   methodA()
}
复制代码

网络异常,图片无法展示
|


这样的做法就会导致一个问题,那就是程序崩溃,不能向下进行继续的处理和异常的返回,因此我们必须有一个良好的异常处理机制进行对error类型的合理输出和处理。

由此,我们引入了defer+panic+recover进行Go程序异常处理

2 defer用法

defer函数类似于一个栈,常用于对流操作的close操作,具体演示下就知道了:

func def() {
   a := func() {
      fmt.Println("A")
   }
   b := func() {
      fmt.Println("B")
   }
   c := func() {
      fmt.Println("C")
   }
   defer c()
   defer b()
   defer a()
}
func main() {
   def()
}
复制代码

执行结果:

网络异常,图片无法展示
|


3 panic和recover用法

为什么将这两个函数放在一起说呢,因为他们两个就相当于Java中的throw和try{...}catch{...}联合进行异常的捕获和处理,示例:

func a() {
   defer func() {
      r := recover()
      fmt.Println("panic recover", r)
   }()
   panic(1)
}
func main() {
   defer func() {
      r := recover()
      fmt.Println("main recover", r)
   }()
   a()
   fmt.Println("main")
   def()
}
复制代码

网络异常,图片无法展示
|


4 总结

  • defer:异常时函数结束返回
  • panic:自定义抛出异常
  • recover:获取并输出异常


相关文章
|
运维 监控
浅析SPI与CAN通信
SPI是一种常用的MCU与外设的通信方式,英文全称Serial Peripheral Interface。与之前介绍过的UART不同,SPI是串行,全双工,同步通信方式。SPI通常有4根物理连接线,分别是CS片选,SCK时钟,MOSI主机输出从机输入和MISO主机输入从机输出。CS片选是从机选择信号线,低电平有效。当CS为低电平时认为主机目前选中的本从机。SCK是串行时钟线,同步通信需要主从机时钟同步,主机利用SCK线与从机实现时钟同步。时钟由主机产生,决定了通讯的速率。
543 0
|
前端开发 JavaScript API
Layui的CRUD(增删改查)
Layui的CRUD(增删改查)
222 0
|
SQL 设计模式 数据库
领域模型:贫血模型与充血模型的深度解析
领域模型:贫血模型与充血模型的深度解析
|
10月前
|
Prometheus Kubernetes 监控
告警规则设置方法
告警规则设置方法
339 3
|
12月前
|
Linux Shell
10-10|linux命令查询 关键字在文本中出现的行数
10-10|linux命令查询 关键字在文本中出现的行数
|
数据安全/隐私保护 网络安全 网络协议
2024年广东省网络系统管理样题第2套服务部署部分
2024年广东省网络系统管理样题第2套服务部署部分
2024年广东省网络系统管理样题第2套服务部署部分
|
JavaScript 前端开发
JavaScript中那些值会被转换为false
JavaScript中那些值会被转换为false
175 0
AttributeError: module ‘torch.jit‘ has no attribute ‘_script_if_tracing‘
AttributeError: module ‘torch.jit‘ has no attribute ‘_script_if_tracing‘
436 0
|
API PHP
用正则匹配ip
用正则匹配ip
279 2
|
存储 安全 BI
支持多医院使用的云HIS医院信息化管理系统源码 SaaS模式
设计和开发HIS系统时需要注意医疗业务需求、数据模型设计、用户界面设计、安全和隐私保护、可扩展性和灵活性、集成和接口设计、测试和质量保证、用户培训和支持等方面的事项,以确保系统能够满足医院的需求并提供良好的使用体验。
278 0