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