如果 panic 发生,恢复并继续 for 循环 Golang
Recover and continue for loop if panic occur Golang
所以我的情况非常复杂,但是为了在清晰明了的上下文中提问,我使用了从 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)
}
}
这在 go 中是否可以实现,比如当出现恐慌时我们可以以某种方式恢复并完成我们的循环?
如果循环主体作为一个函数执行,无论是匿名函数还是命名函数,您都可以这样做,并且在该函数中您使用延迟函数来恢复。
这是匿名函数的样子:
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.
上试试这个
所以我的情况非常复杂,但是为了在清晰明了的上下文中提问,我使用了从 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)
}
}
这在 go 中是否可以实现,比如当出现恐慌时我们可以以某种方式恢复并完成我们的循环?
如果循环主体作为一个函数执行,无论是匿名函数还是命名函数,您都可以这样做,并且在该函数中您使用延迟函数来恢复。
这是匿名函数的样子:
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.
上试试这个