在 Go 中,可以使用 recover()
函数来捕捉协程中的 panic。recover()
必须在 defer
函数中调用。
以下是一个示例程序,演示了如何在协程中使用 recover()
来捕捉 panic:
package main
import (
"fmt"
)
func main() {
go func() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic:", r)
}
}()
// 调用会导致 panic 的函数
panic("oops")
}()
// 让主 goroutine 等待一段时间以便观察输出结果
// 这里为了简化代码,使用了 Sleep 函数
// 实际使用时应该使用 sync.WaitGroup 等方式进行等待
time.Sleep(time.Second)
}
在上面的示例程序中,我们在协程中调用了一个会导致 panic 的函数,然后在 defer
函数中使用 recover()
捕捉了这个 panic,并打印出了错误信息。
需要注意的是,recover()
只能在 defer
函数中使用,而且只有在发生 panic 时才会返回值。如果没有 panic,recover()
会返回 nil
。此外,如果在非协程函数中使用 recover()
,也不会起作用。