如果要捕获 panic,可以使用 defer 和 recover 函数。在 runGoroutine 函数中,我们可以使用 defer 语句来调用一个匿名函数,在该匿名函数中使用 recover 函数来捕获可能发生的 panic。
下面是修改后的代码:
func runGoroutine(f func()) {
maxRetry := 3
go func() {
for i := 0; i < maxRetry; i++ {
defer func() {
if r := recover(); r != nil {
fmt.Printf("Panic: %v\n", r)
}
}()
f()
}
}()
}
在上面的代码中,我们将 defer 语句移到了循环内部,并将其包裹在一个匿名函数中。然后,在该匿名函数中,我们使用 recover 函数来捕获可能发生的 panic。如果程序出现 panic,则会打印错误信息并继续执行下一次循环。如果没有出现 panic,则会正常退出循环。
需要注意的是,defer 语句在当前函数返回之前执行,因此如果 f 函数本身就会抛出 panic,则无法通过 defer 和 recover 来捕获这个错误。因此,在编写 f 函数时应该尽可能避免出现 panic 的情况。