Go中的defer, panic, recover

Go中引入了独有的exception处理:defer, panic, recover,不再有C++/Java中的try/catch了。

 

看看Rob Pike在golang-nuts中关于Go中exception建议的mail,就知道了Rob Pike为什么会那样设计了,以及设计中一些问题的改进。

http://groups.google.com/group/golang-nuts/browse_thread/thread/1ce5cd050bb973e4/8bc45b58a32aed25

 

语义层次的就不说了,关键的是下面一点:

相比与try/catch而言,Go每次在rundefer里都会检查recover返回值,而在C++/Java中则不需,因为C++/Java中把catch block放在一个固定位置,那些catch block在程序正常逻辑中是不会跑到的。

 

 

  func f(dopanic bool) {   
          defer func() {   
                  if x := recover(); x != nil {   
                          fmt.Printf("panicking with value %v\n", v)   
                          panic(x)  // go back to panicking   
                  }   
                  fmt.Printf("function returns normally")   
          }()   
          fmt.Printf("before")   
          p(dopanic)   
          fmt.Printf("after")   
  }   
  func p(dopanic bool) {   
          if dopanic {   
                  panic(3)   
          }   
  }

 

你可能感兴趣的:(Go)