15.3 Recover:从异常中恢复

recover() 这个内建函数被用于从异常或错误场景中恢复:让程序可以从 panicking 重新获得控制权,停止终止过程进而恢复正常执行。

recover() 只能在 defer 修饰的函数中使用:用于取得异常调用中传递过来的错误值,如果是正常执行,调用 recover() 会返回 nil,且没有其它效果。 总结:异常会导致栈被展开直到 defer 修饰的 recover() 被调用或者程序中止。

func protect(g func()) {
    defer func() {
        log.Println("done")
        // 即使有panic,Println也正常执行。
        if err := recover(); err != nil {
        	log.Printf("run time panic: %v", err)
        }
    }()
    log.Println("start")
    g() //   可能发生运行时错误的地方
}
下一节:说到错误处理,就不得不提defer。