panic_defer.go 658 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. // panic_defer.go
  2. package main
  3. import "fmt"
  4. func main() {
  5. f()
  6. fmt.Println("Returned normally from f.")
  7. }
  8. func f() {
  9. defer func() {
  10. if r := recover(); r != nil {
  11. fmt.Println("Recovered in f", r)
  12. }
  13. }()
  14. fmt.Println("Calling g.")
  15. g(0)
  16. fmt.Println("Returned normally from g.")
  17. }
  18. func g(i int) {
  19. if i > 3 {
  20. fmt.Println("Panicking!")
  21. panic(fmt.Sprintf("%v", i))
  22. }
  23. defer fmt.Println("Defer in g", i)
  24. fmt.Println("Printing in g", i)
  25. g(i + 1)
  26. }
  27. /* Output:
  28. Calling g.
  29. Printing in g 0
  30. Printing in g 1
  31. Printing in g 2
  32. Printing in g 3
  33. Panicking!
  34. Defer in g 3
  35. Defer in g 2
  36. Defer in g 1
  37. Defer in g 0
  38. Recovered in f 4
  39. Returned normally from f.
  40. */