panic的参数是一个空接口类型 interface{},所以任意类型的变量都可以传递给panic
recover只有在defer后面的函数体里直接调用才能捕获panic终止异常,否则返回nil异常继续向外传递
defer recover() //这种写法捕捉失败
defer fmt.Println(recover()) //这种写法捕捉失败
defer func(){
func(){
recover()
}()
} //这种写法捕捉失败
def func(){
recover() //这种写法捕捉成功
}
defer except(){
recover() //这样写也是可以的,只要是在defer后面的函数中直接调用就可以
}
捕获异常后打印堆栈追踪信息
package main
import (
"fmt"
"runtime/debug"
)
func main() {
defer func() {
if r:=recover();r!=nil{
fmt.Println(r)
}
debug.PrintStack() //捕获异常后打印堆栈追踪信息
}()
a := make([]int,2)
fmt.Println(a[3])
}