Go语言,panic和recover 遇到错误继续处理

简介: Go语言,panic和recover 遇到错误继续处理

go语言中,如果报错了,会终止程序继续往下操作,可以使用panicrecover实现挽救要终止的进程

使用panic可以控制代码在什么阶段停止

注意:

1、recover()必须搭配defer使用

2、defer 一定要在可能引发panic的语句之前定义

package main
import "fmt"
func a() {
  fmt.Println("a 函数")
}
func b() {
  panic("b error")
}
func c() {
  fmt.Println("c 函数")
}
func main() {
  a()
  b()
  c()
}

输出结果:

a 函数
panic: b error
goroutine 1 [running]:
main.b(...)
        D:/go project/test/for.go:9
main.main()
        D:/go project/test/for.go:17 +0xa5
exit status 2

当运行在第二个函数时,遇到panic会终止程序继续运行

接下来使用recover挽救程序

package main
import "fmt"
func a() {
  fmt.Println("a 函数")
}
func b() {
  defer func() {
    err := recover()
    if err != nil {
      fmt.Println("b 函数")
    }
  }()
  panic("b error")
}
func c() {
  fmt.Println("c 函数")
}
func main() {
  a()
  b()
  c()
}

运行结果:

a 函数
b 函数
c 函数

整个代码当运行到b()时,会处理defer语句,它的作用是先执行正常代码,最后执行defer语句中的代码,即先执行panic再执行defer,在执行defer时,遇到recover挽救func b函数,判断是否有错误,如果err不等于nil,就代表之前代码遇到错误了,执行fmt.Println("b 函数")

可用于场景:

1、需要执行多个服务时,如果一个服务出错了,继续执行接下来的服务,打印出错误

相关文章
|
7天前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
20 7
|
7天前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
7天前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
84 71
|
6天前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
89 67
|
7天前
|
存储 Go
go语言中映射
go语言中映射
24 11
|
8天前
|
Go 索引
go语言使用range关键字
go语言使用range关键字
16 7
|
8天前
|
Go 索引
go语言修改元素
go语言修改元素
18 6
|
9天前
|
Go 索引
go语言for遍历数组或切片
go语言for遍历数组或切片
82 62
|
11天前
|
并行计算 安全 Go
Go语言中的并发编程:掌握goroutines和channels####
本文深入探讨了Go语言中并发编程的核心概念——goroutine和channel。不同于传统的线程模型,Go通过轻量级的goroutine和通信机制channel,实现了高效的并发处理。我们将从基础概念开始,逐步深入到实际应用案例,揭示如何在Go语言中优雅地实现并发控制和数据同步。 ####
|
9天前
|
Go
go语言for遍历映射(map)
go语言for遍历映射(map)
23 12