funcfullName(firstName *string, lastName *string) { if firstName == nil { panic("runtime error: first name cannot be nil") } if lastName == nil { panic("runtime error: last name cannot be nil") } fmt.Printf("%s %s\n", *firstName, *lastName) fmt.Println("returned normally from fullName") }
funcslicePanic() { n := []int{5, 7, 4} fmt.Println(n[4]) fmt.Println("normally returned from a") } funcmain() { slicePanic() fmt.Println("normally returned from main") }
funcfullName(firstName *string, lastName *string) { defer fmt.Println("deferred call in fullName") if firstName == nil { panic("runtime error: first name cannot be nil") } if lastName == nil { panic("runtime error: last name cannot be nil") } fmt.Printf("%s %s\n", *firstName, *lastName) fmt.Println("returned normally from fullName") }
funcmain() { defer fmt.Println("deferred call in main") firstName := "Elon" fullName(&firstName, nil) fmt.Println("returned normally from main") }
funcrecoverFullName() { if r := recover(); r!= nil { fmt.Println("recovered from ", r) } }
funcfullName(firstName *string, lastName *string) { defer recoverFullName() if firstName == nil { panic("runtime error: first name cannot be nil") } if lastName == nil { panic("runtime error: last name cannot be nil") } fmt.Printf("%s %s\n", *firstName, *lastName) fmt.Println("returned normally from fullName") }
funcmain() { defer fmt.Println("deferred call in main") firstName := "Elon" fullName(&firstName, nil) fmt.Println("returned normally from main") }
funcrecoverFullName() { if r := recover(); r != nil { fmt.Println("recovered from ", r) debug.PrintStack() } }
funcfullName(firstName *string, lastName *string) { defer recoverFullName() if firstName == nil { panic("runtime error: first name cannot be nil") } if lastName == nil { panic("runtime error: last name cannot be nil") } fmt.Printf("%s %s\n", *firstName, *lastName) fmt.Println("returned normally from fullName") }
funcmain() { defer fmt.Println("deferred call in main") firstName := "Elon" fullName(&firstName, nil) fmt.Println("returned normally from main") }
recovered from runtime error: last name cannot be nil goroutine 1 [running]: runtime/debug.Stack(0x37, 0x0, 0x0) /usr/local/go-faketime/src/runtime/debug/stack.go:24 +0x9d runtime/debug.PrintStack() /usr/local/go-faketime/src/runtime/debug/stack.go:16 +0x22 main.recoverFullName() /tmp/sandbox771195810/prog.go:11 +0xb4 panic(0x4a1b60, 0x4dc300) /usr/local/go-faketime/src/runtime/panic.go:969 +0x166 main.fullName(0xc0000a2f28, 0x0) /tmp/sandbox771195810/prog.go:21 +0x1cb main.main() /tmp/sandbox771195810/prog.go:30 +0xc6 returned normally from main deferred call in main
从输出中,你可以了解到,panic被恢复了,并且recovered from runtime error: last name cannot be nil被打印出来。在这之后,堆栈跟踪被打印出来。然后
v1.5.2