Recover and continue for loop if panic occur Golang

Multi tool use
Multi tool use


Recover and continue for loop if panic occur Golang



so my case is quite complex but for asking question in clean and clear context I am using simple for loop that initiate from 0 and goes upto 10. Now what I am trying to do is when i becomes equal to 2 program will consider this as panic. It will go to recover state using defer and then after recovery loop will resume.


i becomes equal to 2



So desired output should be something like that:


0
1
panic occured: got 2
3
4
.
.
.
.
.
10



Actual output I am getting


0
1
panic occured got: got 2



Code block:


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)
}

}



Can this be achievable in go like when panic occur somehow we can recover and complete our loop?




1 Answer
1



You can do that if the body of the loop is executed as a function, either anonymous or a named one, and in that function you use a deferred function to recover.



Here's how it looks like with anonymous functions:


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)
}()
}
}



Output (try it on the Go Playground):


0
1
panic occured: got 2
3
4
5
6
7
8
9
10



It's nicer and easier to understand if you move it to a named function:


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)
}



Output is the same. Try this one on the Go Playground.





thanks @icza for your answer and explanation, your logic and solution help me such cases create separate function for panic and recovery. Again thanks!
– Ahsan Naseem
Jun 30 at 8:57






By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

b hM3kGhVPUOsR4aV mfp9H2G3olOay 6G,n,N8Iv,C IPkB1iO2Ju,Aun3
hq,Rm,r5VZTYLsQ47a7Gb

Popular posts from this blog

Delphi Android file open failure with API 26

.

Amasya