在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、需要执行多个服务时,如果一个服务出错了,继续执行接下来的服务,打印出错误