go異常處理

1.panic("error message") 在任何地方均可以執行,後續代碼不會在執行, 相似php的die。panic用於拋出異常, recover用於捕獲異常.
package main
import "os"
import "fmt"
func main() {
    var user = os.Getenv("USER")
    if user == "" {
        panic("The USER environment variable is not set.")
    }
   fmt.Println("continue exec")
}
 
運行結果: panic: The USER environment variable is not set.
 
2. recover
recover只能在defer語句中使用, 直接調用recover是無效的.recover()方法有一個返回值,若是recover()捕獲到panic,則返回panic對象,不然返回nil。 相似php的try{} catch() {}
 
package main
import "fmt"

func f1() {
    fmt.Println("This is f1()")
}

func f2() {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("Exception has been caught.")
        }
    }()
    fmt.Println("This is f2()")
    panic(1)
}

func f3() {
    fmt.Println("This is f3()")
}

func main() {
    f1()
    f2()
    f3()
}
 
運行結果
  This is f1()
  This is f2()
  Exception has been caught.
  This is f3()
 
經過在f2的defer函數中調用recover,捕獲了異常,程序恢復正常的執行,繼續執行f3
 
3.defer
defer語句延遲執行一個函數,該函數被推遲到當包含它的程序返回時(包含它的函數 執行了return語句/運行到函數結尾自動返回/對應的goroutine panic)執行。defer的函數的任何返回值都會被丟棄。 在聲明時不會當即執行,而是在函數 return 後,再按照 FILO (先進後出)的原則依次執行每個 defer.
 
package main
import "fmt"

func fn(n int) int {
 defer func() {
  n++
  fmt.Println("3st:", n)
 }()

 defer func() {
  n++
  fmt.Println("2st:", n)
 }()

 defer func() {
  n++
  fmt.Println("1st:", n)
 }()
 return n //沒有作任何事情
}

func main() {
 fmt.Println("函數返回值:", fn(0))
}

  

運行結果:1st 1
     2st 2
     3st 3
相關文章
相關標籤/搜索