panic

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])
}




原文地址:https://www.cnblogs.com/hualou/p/12070113.html