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。