在go语言中,如果报错了,会终止程序继续往下操作,可以使用panic
和recover
实现挽救要终止的进程
使用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、需要执行多个服务时,如果一个服务出错了,继续执行接下来的服务,打印出错误