Go语言recover():恢复程序正常执行(附带实例)
Go语言中,使用 recover() 可以在宕机后让程序继续执行。recover() 是 Go语言的内置函数,该函数可以捕获 panic 信息,类似于其他编程语言中用于捕获异常的 try…catch 语句。recover 通常在使用 defer 语句的函数中执行。
如果当前执行的函数发生 panic,那么调用 recover() 函数可以获取 panic 信息,并且恢复程序正常执行。
示例代码如下:
如果 panic() 函数和 recover() 函数一起使用,并且程序中的函数调用比较复杂,则在执行完对应的 defer 语句后,程序退出当前函数并返回到调用处继续执行。代码如下:
如果当前执行的函数发生 panic,那么调用 recover() 函数可以获取 panic 信息,并且恢复程序正常执行。
示例代码如下:
package main
import "fmt"
func test() {
defer func() {
err := recover()
if err != nil {
fmt.Println(err)
}
fmt.Println("恢复执行")
}()
panic("程序崩溃") // 触发宕机
}
func main() {
fmt.Println("程序开始")
test()
fmt.Println("程序结束")
}
运行结果如下:
程序开始
程序崩溃
恢复执行
程序结束
如果 panic() 函数和 recover() 函数一起使用,并且程序中的函数调用比较复杂,则在执行完对应的 defer 语句后,程序退出当前函数并返回到调用处继续执行。代码如下:
package main
import "fmt"
func first() {
fmt.Println("first 函数开始")
second()
fmt.Println("first 函数结束")
}
func second() {
defer func() { recover() }()
fmt.Println("second 函数开始")
third()
fmt.Println("second 函数结束")
}
func third() {
fmt.Println("third 函数开始")
panic("Program crash") // 触发宕机
fmt.Println("third 函数结束")
}
func main() {
fmt.Println("程序开始")
first()
fmt.Println(19)
fmt.Println("程序结束")
}
运行结果为:
程序开始
first 函数开始
second 19开始
Program crash
second 函数结束
first 函数结束
程序结束
如果 defer 语句中也存在 panic,那么只有最后一个 panic 可以被 recover() 函数捕获。代码如下:注意,虽然 panic() 函数和 recover() 函数可以模拟其他语言的异常机制,但在编写普通函数时不建议使用这种特性。
package main
import "fmt"
func main() {
defer func() {
err := recover()
if err != nil {
fmt.Println(err)
}
fmt.Println("恢复执行")
}()
defer func() {
panic("defer panic") // 触发宕机
}()
panic("panic") // 触发宕机
}
运行结果如下:
defer panic
恢复执行
ICP备案:
公安联网备案: