运行时panic异常一旦被引发就会导致程序崩溃。这当然不是我们愿意看到的,因为谁也不能保证程序不会发生任何运行时错误。

不过,Go语言为我们提供了专用于“拦截”运行时panic的内建函数——recover。它可以是当前的程序从运行时panic的状态中恢复并重新获得流程控制权。

  1. func recover() interface{}

注意:recover只有在defer调用的函数中有效。

如果调用了内置函数recover,并且定义该defer语句的函数发生了panic异常,recover会使程序从panic中恢复,并返回panic value。导致panic异常的函数不会继续运行,但能正常返回。在未发生panic时调用recover,recover会返回nil。

示例代码:

  1. func TestA() {
  2. fmt.Println("func TestA()")
  3. }
  4. func TestB() (err error) {
  5. defer func() { //在发生异常时,设置恢复
  6. if x := recover(); x != nil {
  7. //panic value被附加到错误信息中;
  8. //并用err变量接收错误信息,返回给调用者。
  9. err = fmt.Errorf("internal error: %v", x)
  10. }
  11. }()
  12. panic("func TestB(): panic")
  13. }
  14. func TestC() {
  15. fmt.Println("func TestC()")
  16. }
  17. func main() {
  18. TestA()
  19. err := TestB()
  20. fmt.Println(err)
  21. TestC()
  22. /*
  23. 运行结果:
  24. func TestA()
  25. internal error: func TestB(): panic
  26. func TestC()
  27. */
  28. }

延迟调用中引发的错误,可被后续延迟调用捕获,但仅最后⼀个错误可被捕获:

  1. func test() {
  2. defer func() {
  3. fmt.Println(recover())
  4. }()
  5. defer func() {
  6. panic("defer panic")
  7. }()
  8. panic("test panic")
  9. }
  10. func main() {
  11. test()
  12. //运行结果:defer panic
  13. }
作者:admin  创建时间:2018-06-18 06:15
 更新时间:2018-06-18 06:17
上一篇:
下一篇: