panic() 会停止当前函数F的执行,开始执行 defer 标记的操作,执行完成后将自己的参数返回到调用函数G,G打印这个返回值,开始执行 defer 标记的操作,执行完退出G。
panic() 可以用 recover() 捕获,相当于 Java 中的 try-catch,但尽量通过 error 来处理异常,panic() 用于程序无法运行的情况。
recover必须定义在panic之前的defer语句中。当 panic 被触发时,goroutine 不会终止,而是会执行在 panic 之前定义的 defer 语句,因为 defer 是以栈的顺序注册操作的。
func main() {
recoverTest()
}
func recoverTest() {
defer func() {
if r := recover(); r != nil {
fmt.Printf("error %s", r)
}
}()
panic("error msg")
}
有了 panic() ,为什么还要用 os.exit()
os.exit() 可以让程序以给出的状态码退出。一般 0 表示成功,非 0 表示出错。程序会立刻终止,defer 的操作不会被执行。panic() 可以触发 defer延迟语句,还可以被 recover 捕获处理。
todo
if r := recover(); r != nil { 这种写法是因为 := 有布尔类型的返回值吗?