Recover helps your program catch and handle errors so it doesn't crash suddenly.
When you want to stop your program from crashing after a mistake.
When you want to clean up or log information after an error happens.
When you want to keep your program running even if one part fails.
When you want to handle unexpected problems gracefully.
Syntax
Go
defer func() {
if r := recover(); r != nil {
// handle the error here
}
}()
defer delays running the function until the surrounding function finishes.
recover() catches the error (panic) if there is one.
Examples
This example prints the error message when a panic happens.
Go
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic:", r)
}
}()
This function uses recover to avoid crashing when dividing by zero.
Go
func safeDivide(a, b int) int {
defer func() {
if r := recover(); r != nil {
fmt.Println("Cannot divide by zero")
}
}()
return a / b
}
Sample Program
This program starts, then panics with a message. The deferred function catches the panic and prints a recovery message. The last print does not run because of the panic.
Go
package main
import"fmt"
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic:", r)
}
}()
fmt.Println("Start program")
panic("Something went wrong!")
fmt.Println("This will not run")
}
OutputSuccess
Important Notes
Recover only works inside a deferred function.
If you don't recover, a panic will stop your program immediately.
Use recover carefully to avoid hiding real problems.
Summary
Recover helps catch errors and keep your program running.
Use defer with recover to handle panics safely.
Recover must be called inside a deferred function.
Practice
(1/5)
1. What is the main purpose of the recover function in Go?
easy
A. To handle errors returned by functions
B. To start a new goroutine
C. To pause the execution of a function
D. To catch a panic and prevent the program from crashing
Solution
Step 1: Understand panic and recover
Panic causes a program to stop immediately unless recovered.
Step 2: Role of recover
Recover catches the panic inside a deferred function to keep the program running.
Final Answer:
To catch a panic and prevent the program from crashing -> Option D
Quick Check:
recover catches panic = A [OK]
Hint: Recover catches panics only inside deferred functions [OK]
Common Mistakes:
Thinking recover handles normal errors
Using recover outside deferred functions
Confusing recover with panic
2. Which of the following is the correct way to use recover in Go?
easy
A. Call recover directly inside the main function
B. Call recover inside a deferred function
C. Call recover inside a goroutine
D. Call recover after a panic has finished
Solution
Step 1: Identify recover usage rules
Recover must be called inside a deferred function to catch panics.
Step 2: Analyze options
Only Call recover inside a deferred function calls recover inside a deferred function.
Final Answer:
Call recover inside a deferred function -> Option B
Quick Check:
recover inside defer = B [OK]
Hint: Always use recover inside defer to catch panics safely [OK]
Common Mistakes:
Calling recover directly without defer
Calling recover after panic ends
Using recover in goroutines without defer
3. What will be the output of this Go program?
package main
import "fmt"
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic:", r)
}
}()
panic("something went wrong")
fmt.Println("This will not print")
}
medium
A. Recovered from panic: something went wrong
B. something went wrong
C. This will not print
D. Program crashes with panic message
Solution
Step 1: Understand defer and recover behavior
The deferred function runs after panic starts, calling recover to catch it.
Step 2: Output analysis
Recover prints the panic message, so output is "Recovered from panic: something went wrong".
Final Answer:
Recovered from panic: something went wrong -> Option A
Quick Check:
defer + recover prints panic message = C [OK]
Hint: Recover prints panic message inside deferred function [OK]
Common Mistakes:
Expecting code after panic to run
Thinking panic message prints directly
Ignoring deferred recover function
4. What is wrong with this Go code snippet?
func main() {
recover()
panic("error")
}
medium
A. panic() cannot be called without defer
B. panic() must be called before recover()
C. recover() is called outside a deferred function and will not catch panic
D. recover() cannot be called in main function
Solution
Step 1: Check recover usage
Recover only works inside deferred functions to catch panics.
Step 2: Analyze code
Recover is called directly, so it won't catch the panic, causing program to crash.
Final Answer:
recover() is called outside a deferred function and will not catch panic -> Option C
Quick Check:
recover outside defer = no panic catch = D [OK]
Hint: Recover must be inside defer to catch panic [OK]
Common Mistakes:
Calling recover directly without defer
Assuming recover catches panic anytime
Misunderstanding panic and recover order
5. You want to safely handle panics in a function that divides two numbers and returns the result. Which code snippet correctly uses recover to avoid crashing when dividing by zero?
hard
A. func safeDivide(a, b int) int {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic")
}
}()
return a / b
}
B. func safeDivide(a, b int) int {
if b == 0 {
recover()
}
return a / b
}
C. func safeDivide(a, b int) int {
return a / b
defer recover()
}
D. func safeDivide(a, b int) int {
defer recover()
return a / b
}
Solution
Step 1: Identify correct recover usage
Recover must be called inside a deferred anonymous function to catch panics.
Step 2: Analyze options
Only func safeDivide(a, b int) int {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic")
}
}()
return a / b
} uses defer with an anonymous function calling recover properly.
Final Answer:
func safeDivide(a, b int) int {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic")
}
}()
return a / b
} -> Option A
Quick Check:
defer func with recover = safe panic handling = A [OK]
Hint: Use defer with anonymous func calling recover to catch panics [OK]
Common Mistakes:
Calling recover without defer
Calling recover outside anonymous function
Placing defer after return statement
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.