所以我的情况很复杂,但要在干净的上下文中询问问题,我使用的是从0开始到10的简单for循环。现在我想做的是i becomes equal to 2
程序何时考虑感到恐慌。它将使用defer进入恢复状态,然后在恢复循环后恢复。
所以所需的输出应该是这样的:
0
1
panic occured: got 2
3
4
.
.
.
.
.
10
我得到的实际输出
0
1
panic occured got: got 2
代码块:
package main
import "fmt"
func main() {
goFrom1To10()
}
func goFrom1To10() {
defer recovery()
for i := 0; i <= 10; i++ {
if i == 2 {
panic("got 2")
}
fmt.Println(i)
}
}
func recovery() {
if r := recover(); r != nil {
fmt.Println("panic occured: ", r)
}
}
能像在发生恐慌时以某种方式我们可以恢复并完成循环那样实现吗?
答案 0 :(得分:7)
如果循环的主体是作为匿名或命名函数执行的,则可以执行此操作,并在该函数中使用延迟函数进行恢复。
这是匿名功能的样子:
func goFrom1To10() {
for i := 0; i <= 10; i++ {
func() {
defer func() {
if r := recover(); r != nil {
fmt.Println("panic occured: ", r)
}
}()
if i == 2 {
panic("got 2")
}
fmt.Println(i)
}()
}
}
输出(在Go Playground上尝试):
0
1
panic occured: got 2
3
4
5
6
7
8
9
10
如果将其移至命名函数,它将更好,更容易理解:
func goFrom1To10() {
for i := 0; i <= 10; i++ {
task(i)
}
}
func task(i int) {
defer func() {
if r := recover(); r != nil {
fmt.Println("panic occured: ", r)
}
}()
if i == 2 {
panic("got 2")
}
fmt.Println(i)
}
输出是相同的。在Go Playground上尝试这个。