Go
Beginner
1 min read
Defer, Panic, and Recover
Example
package main
import (
"fmt"
"os"
)
// safeDiv recovers from a panic and returns an error instead.
func safeDiv(a, b int) (result int, err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("recovered from panic: %v", r)
}
}()
result = a / b // panics if b == 0
return
}
// openFile shows defer for cleanup
func openFile(name string) error {
f, err := os.Open(name)
if err != nil {
return err
}
defer f.Close() // guaranteed to run
// ... process file ...
fmt.Println("opened:", f.Name())
return nil
}
// deferOrder shows LIFO execution
func deferOrder() {
for i := 0; i < 3; i++ {
defer fmt.Printf("deferred %d\n", i)
}
fmt.Println("after loop")
}
func main() {
res, err := safeDiv(10, 2)
fmt.Println("10/2 =", res, err)
res, err = safeDiv(10, 0)
fmt.Println("10/0 =", res, err)
_ = openFile("nonexistent.txt")
deferOrder()
// prints: after loop, deferred 2, deferred 1, deferred 0
}