贝利信息

如何使用Golang recover捕获panic_Golang异常恢复机制解析

日期:2026-01-14 00:00 / 作者:P粉602998670
recover必须在defer中调用才有效,仅在panic发生且当前goroutine的defer链执行时返回panic值,否则返回nil;它不回滚副作用,仅实现goroutine软着陆。

recover 必须在 defer 中调用才有效

直接在普通函数体里写 recover() 永远返回 nil,它只在 panic 正在发生、且当前 goroutine 的 defer 链正在执行时才有意义。Go 运行时会把 panic 的值“传递”给正在执行的 defer 函数中的 recover() 调用。

recover 返回值类型是 interface{},需手动断言

recover() 返回的是任意类型的 panic 值,不是错误对象。如果你用 panic("oops"),recover 得到的是 string;如果用 panic(errors.New("db fail")),得到的是 *errors.errorString;甚至可能是自定义结构体。

recover 无法恢复已释放的资源或已提交的状态

recover 只是让 goroutine 从 panic 状态中“软着陆”,继续执行 defer 后的代码,但它不撤销任何已发生的副作用。

嵌套 defer 和多层 recover 的行为容易误判

一个函数里可以有多个 defer,它们按后进先出(LIFO)顺序执行;每个 defer 里的 recover() 都有机会捕获 panic,但只有第一个成功调用的能拿到 panic 值,后续都返回 nil

recover 不是 try/catch,它没有“异常传播”概念,也没有 finally 语义。真正难的从来不是写那行 recover(),而是判断哪里该用、哪里不该用,以及 panic 之后你还敢信任哪些数据。