Go-panic

135 阅读1分钟

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 { 这种写法是因为 := 有布尔类型的返回值吗?