Recover and continue for loop if panic occur

Hello experts, so from state of my question you can clearly guess I am pretty new to golang and coming from python background. 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.

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

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

}

This recovery and continue loop might seems wrong way to handle things but in my case its necessary to continue loop if got panic.

Thanks.

The function will still immediately end, even if you recover. You could probably have some function in the for loop like this:

package main

import "fmt"

func main() {
	goFrom1To10()
}

func goFrom1To10() {
	for i := 0; i <= 10; i++ {
		func() {
			defer recovery()
			if i == 2 {
				panic("got 2")
			}
			fmt.Println(i)
		}()
	}
}

func recovery() {
	if r := recover(); r != nil {
		fmt.Println("panic occured: ", r)
	}
}

What this will now do, is defer a recover in the anonymous function. If it panics there, it will only escape that function, and still regularly continue the for loop.
Do remember that panicking isn’t really very elegant and you should probably avoid it where possible.

2 Likes

much thanks for clear explanation with example. Now I can understand that defer should be inside function to avoid breaking for loop

1 Like

This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.