golang中没有try... catch...,因此当golang中遇到panic时,若是不进行recover,便会致使整个程序挂掉,具体例子以下:golang
package main import ( "fmt" ) func main() { panic("fault") fmt.Println("panic") }
运行结果:
panic: fault
goroutine 16 [running]:...
程序挂掉,而且报告出错的地方,并打印出掉用的栈
解决办理:利用defer延迟处理的recover进行恢复,具体例子以下:函数
package main import ( "fmt" ) func main() { defer func() { fmt.Println("1") }() defer func() { if err := recover(); err != nil { fmt.Println(err) } }() panic("fault") fmt.Println("2") } 运行结果: fault 1
程序首先运行panic,出现故障,此时跳转到包含recover()的defer函数执行,recover捕获panic,此时panic就不继续传递.可是recover以后,程序并不会返回到panic那个点继续执行之后的动做,而是在recover这个点继续执行之后的动做,即执行上面的defer函数,输出1.
注意:利用recover处理panic指令,必须利用defer在panic以前声明,不然当panic时,recover没法捕获到panic,没法防止panic扩散.spa