mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-12 03:34:15 +08:00
46 lines
658 B
Go
Executable File
46 lines
658 B
Go
Executable File
// panic_defer.go
|
|
package main
|
|
|
|
import "fmt"
|
|
|
|
func main() {
|
|
f()
|
|
fmt.Println("Returned normally from f.")
|
|
}
|
|
|
|
func f() {
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
fmt.Println("Recovered in f", r)
|
|
}
|
|
}()
|
|
fmt.Println("Calling g.")
|
|
g(0)
|
|
fmt.Println("Returned normally from g.")
|
|
}
|
|
|
|
func g(i int) {
|
|
if i > 3 {
|
|
fmt.Println("Panicking!")
|
|
panic(fmt.Sprintf("%v", i))
|
|
}
|
|
defer fmt.Println("Defer in g", i)
|
|
fmt.Println("Printing in g", i)
|
|
g(i + 1)
|
|
}
|
|
|
|
/* Output:
|
|
Calling g.
|
|
Printing in g 0
|
|
Printing in g 1
|
|
Printing in g 2
|
|
Printing in g 3
|
|
Panicking!
|
|
Defer in g 3
|
|
Defer in g 2
|
|
Defer in g 1
|
|
Defer in g 0
|
|
Recovered in f 4
|
|
Returned normally from f.
|
|
*/
|