用Recover來實現更健壯的go程序


緣起:線上的go service 掛了,無法啟動。

原因:采用的第三方庫有個bug, 在go攜程里面執行task的時候會產生out of range 的panic, 而我又把任務隊列每次加載的時候重做一次,導致無法啟動。

分析:go攜程里面某個task執行失敗,不應該影響service的正常運行。

 

解決:在go協程插入recover, 出現panic的時候,自己退出而不影響整個service

 func server(workChan <-chan *Work) {
      for work := range workChan {
          go safelyDo(work)
      }
  }
  
  func safelyDo(work *Work) {
      defer func() {
          if err := recover(); err != nil {
              log.Stderr("work failed:", err)
              debug.PrintStack()
          }
      }()
      do(work)
  }

 

參考:

http://www.yiibai.com/go/go_error_handle.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM