panic和cover

Panic:是内建的停止控制流的函数。相当于其他编程语言的抛异常操作。当函数F调用了panic,F的执行会被停止,在F中panic前面定义的defer操作都会被执行,然后F函数返回。对于调用者来说,调用F的行为就像调用panic(如果F函数内部没有把panic recover掉)。如果都没有捕获该panic,相当于一层层panic,程序将会crash。panic可以直接调用,也可以是程序运行时错误导致,例如数组越界。

Recover:是一个从panic恢复的内建函数。Recover只有在defer的函数里面才能发挥真正的作用。如果是正常的情况(没有发生panic),调用recover将会返回nil并且没有任何影响。如果当前的goroutine panic了,recover的调用将会捕获到panic的值,并且恢复正常执行。

package testimport ("fmt")func Covertest(){defer func(){//defer 压入栈底if info:=recover();info!=nil{fmt.Println("catch -->"+info.(string))}else{fmt.Println("function excute ok")}}()fmt.Println("start test panic...catch...")fmt.Println("this function will panic...")panic("panic here...")//panic 引发退出,此行后面都不会执行,只会执行已入栈的deferfmt.Println("after panic,this case will not print...")defer func(){fmt.Println("defer after panic will not excute...")}()
}

运行结果:

start test panic...catch...
this function will panic...
catch -->panic here...

总结:

1.panic前的代码都会正常执行,
2.panic()的源码里面是这样func panic(v interface{}),接收的是接口,即任何你需要的类型
3.recover会catch住panic括号里的内容(info)
4.后面虽然用了defer,但还未压入栈之前程序已经退出了,所以不会执行,panic之前的defer才有效