Go Panic
Go Panic
Go panic 是我们处理错误情况的一种机制。恐慌可用于中止函数执行。当一个函数调用 panic 时,它的执行会停止并且控制流向关联的延迟函数。
这个函数的调用者也被终止并且调用者的延迟函数被执行(如果有的话)。这个过程一直持续到程序终止。现在报告错误情况。
这种终止序列称为恐慌,可以由内置函数recover控制。
Go Panic Example 1:
package main
import "os"
func main() {
panic("Error Situation")
_, err := os.Open("/tmp/file")
if err != nil {
panic(err)
}
}
输出:
panic: Error Situation
goroutine 1 [running]:
main.main()
/Users/pro/GoglandProjects/Panic/panic example1.go:6 +0x39
进入恐慌示例 2
package main
import "fmt"
func main() {
fmt.Println("Calling x from main.")
x()
fmt.Println("Returned from x.")
}
func x() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered in x", r)
}
}()
fmt.Println("Executing x...")
fmt.Println("Calling y.")
y(0)
fmt.Println("Returned normally from y.")
}
func y(i int) {
fmt.Println("Executing y....")
if i > 2 {
fmt.Println("Panicking!")
panic(fmt.Sprintf("%v" , i))
}
defer fmt.Println("Defer in y", i)
fmt.Println("Printing in y", i)
y(i + 1)
}
输出:
Calling x from main.
Executing x...
Calling y.
Executing y....
Printing in y 0
Executing y....
Printing in y 1
Executing y....
Printing in y 2
Executing y....
Panicking!
Defer in y 2
Defer in y 1
Defer in y 0
Recovered in x 3
Returned from x.