原文地址:http://www.niu12.com/article/14 panic知识点 package main import ( "fmt" "github.com/pkg/errors" ) func main() { outerFunc() fmt.Println(1) } func outerFunc() { innerFunc() } func innerFunc() { panic(errors.New("An intended fatal error")) } 当调用innerFunc 函数中的panic函数后,innerFunc 的执行会被中止。 紧接着,流程控制权会交回给调用方outerFunc函数。 而后, outerFunc函数的执行也将被中止。运行时恐慌就这样沿着调用栈反方向进行传播, 直至到达当前goroutine的调用栈的最顶层。-旦达到顶层,就意味着该goroutine调用栈 中全部函数的执行都已经被中止了,程序已经崩溃。 GO运行时系统也会调用panic() 函数 recover 运行时恐慌一旦被引起,就会向调用方传播直至程序崩溃。 Go 提供了专用于“拦截” 运行时恐慌的内建函数 recover ,它能够使气前的程序从恐慌状态中恢复并从新获 得流程控制权。 recover 函数被调川后,会返回一个 interfaoe { }类型的结果、 若是当时的程序正处于运行时恐慌的状态,那么这个结果就会是非 nil 的。 func innerFunc() { defer func() { if p := recover(); p != nil { fmt.Printf("Recovered panic:%s\n", p) } }() panic(errors.New("An intended fatal error")) } 将defer 匿名函数放在函数体的开始处,能够有效防止该函数及其下层调用中的代码引起运行时恐慌 口能够把运行时恐慌的携带值转换为error类型值,并看成常规结果返回给调用方。 这样既阻止了恐慌的扩散,又传递了引发恐慌的缘由。 口检查运行时恐慌携带值的类型,并根据类型作不一样的后续动做,这样能够精确地 控制程序的错误处理行为。