所以我的情况相当复杂,但是在干净清晰的上下文中提问我使用简单的for循环,从0开始,然后上升到10.现在我要做的是当i becomes equal to 2程序将此视为恐慌时.它将使用延迟恢复状态,然后恢复循环将恢复.
所以期望的输出应该是这样的:
0
1
panic occured: got 2
3
4
.
.
.
.
.
10
Run Code Online (Sandbox Code Playgroud)
我得到的实际输出
0
1
panic occured got: got 2
Run Code Online (Sandbox Code Playgroud)
代码块:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
这可以实现,就像恐慌发生时我们可以恢复并完成我们的循环吗?
如果循环体作为函数(匿名函数或命名函数)执行,并且在该函数中使用延迟函数进行恢复,则可以执行此操作.
以下是匿名函数的外观:
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)
}()
}
}
Run Code Online (Sandbox Code Playgroud)
输出(在Go Playground上试试):
0
1
panic occured: got 2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)
如果将其移动到命名函数,它会更好,更容易理解:
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)
}
Run Code Online (Sandbox Code Playgroud)
输出是一样的.在Go Playground尝试这个.