15.recover

捕获致命错误

recover

  • 仅在 defer 调用中使用
  • 获取 panic 的 值
  • 如果无法处理, 可重新 panic

通常来说,不应该对panic异常做任何处理,但有时,也许我们可以从异常中恢复,至少我们可以在程序崩溃前,做一些操作。

在未发生panic时调用recover,recover会返回nil。

不加区分的恢复所有的panic异常,不是可取的做法;虽然把对panic的处理都集中在一个包下,有助于简化对复杂和不可以预料问题的处理,但作为被广泛遵守的规范,你不应该试图去恢复其他包引起的panic。

1
2
3
4
5
6
7
8
9
 defer func() {
        switch p := recover(); p {
        case nil:       // 没有异常
        case bailout{}: // 发现异常
            err = fmt.Errorf("multiple title elements")
        default:
            panic(p) //未知异常
        }
    }()
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
func tryRecover(){
  defer func(){
    r := recover()
    if err,ok := r.(error); ok {
      fmt.Println("error occurred:",err)
    }else{
      panic(r)
    }
  }()
  panic(errors.New("this is an error"))
}

func main(){
  tryRecover()
}
Licensed under CC BY-NC-SA 4.0
本文阅读量 次, 总访问量 ,总访客数
Built with Hugo .   Theme Stack designed by Jimmy