panic,类似其他语言throw抛出异常一样,通过函数调用链,一层层的把异常往上抛出去,如果没有人拦截异常,就会退出程序。
一、直接panic
panic后直接抛出异常,程序终止,后续操作都不会执行
package main
import "fmt"
// 直接panic,panic后直接抛出异常,程序终止,后续操作都不会执行
func PanicTest() {
fmt.Println("a")
panic("panic 错误")
fmt.Println("b")
}
func main() {
PanicTest()
fmt.Println("error test")
}
运行结果:
./prog.go:9:2: unreachable code
Go vet exited.
a
panic: panic 错误
goroutine 1 [running]:
main.PanicTest()
/tmp/sandbox620865355/prog.go:8 +0x95
main.main()
/tmp/sandbox620865355/prog.go:13 +0x25
二、panic recover同时使用
因为我们通过recover函数,在延迟执行函数中,拦截了Panic错误,除了抛出panic错误的函数被中断了,其他执行流程都不受影响,类似其他语言中的try/catch机制。
package main
import "fmt"
// 通过defer和recover实现拦截panic错误
func PanicRecoverTest() {
defer func() {
if err := recover(); err != nil {
fmt.Println("拦截到错误:", err)
}
}()
panic("panic 错误")
fmt.Println("c")
}
func main() {
PanicRecoverTest()
fmt.Println("error test")
}
运行结果:
./prog.go:14:2: unreachable code
Go vet exited.
拦截到错误: panic 错误
error test