Go錯誤處理機制及自定義錯誤


錯誤處理機制:

先看一段代碼:看看輸出什么?

package main
import "fmt"

func test() {
  num1 := 10
  num2 := 0
  res := num1 / num2
  fmt.Println("res=",res)
}

func main() {
  test()
  fmt.Println("下面的代碼和邏輯...")
}

對上面代碼的總結:

  1)在默認情況下,當發生錯誤后(panic),程序就會退出(崩潰了)

  2)如果我們希望,當發生錯誤后,可以捕獲到錯誤,保證程序可以繼續執行。還可以在捕獲到錯誤后,給管理員一個提示(郵件,短信...)

  3)這里引出我們要講的錯誤處理機制

基本說明:

  1)Go語言追求簡潔優雅,所以,Go語言不支持傳統的 try...catch...finally 這種處理

  2)Go中引入的處理方式為: defer, panic, recover

  3)這幾個異常的使用場景可以這么簡單描述:Go中可以拋出一個panic的異常,然后在defer 中通過 recover (內置函數) 捕獲這個異常,然后正常處理


針對上面的錯誤代碼進行處理: 使用defer 和 recover 來處理錯誤

func test() {
  //使用defer + recover 來捕獲和處理異常
  defer func () {
    //err := recover() //recover()內置函數,可以捕獲異常
    if err := recover(); err != nil { //說明捕獲到錯誤
      fmt.Println("err=", err)
      //這里就可將錯誤信息發送給管理員
      fmt.Println("發送郵件給admin@sohu.com")
    }
  }()
  num1 := 10
  num2 := 0
  res := num1 / num2
  fmt.Println("res=",res)
}

func main() {
  test()
  for {
    fmt.Println("main()下面的代碼和邏輯...")
    time.Sleep(time.Second)
  }
}


錯誤處理的好處:

進行錯誤處理后,程序不會輕易掛掉,如果加入預警代碼,就可以讓程序更加的健壯。

 

自定義錯誤:


Go程序中,也支持自定義錯誤,使用errors.New 和 panic 內置函數。

  1)errors.New("錯誤說明"),會返回一個error類型的值,表示一個錯誤
  2)panic內置函數,接受一個interface{}類型的值(也就是任何值了) 作為參數。可以接受error類型的變量,輸出錯誤信息,並退出程序。

案例演示:

package main
import (
  "fmt"
  "errors"
)

//函數去讀取一配置文件init.conf的信息
//如果文件名傳入不正確,我們就返回一個自定義的錯誤
func readConf(name string) (err error) {
  if name == "config.ini" {
    //讀取...
    return nil
  } else {
    //返回一個自定義錯誤
    return errors.New("讀取文件錯誤...")
  }
}

func test02() {
  err := readConf("config2.ini")
  if err != nil {
    //如果讀取文件發生錯誤,就輸出這個錯誤,並終止程序
    panic(err)
  }
  fmt.Println("test02()繼續執行...")
}

func main() {
  test02()
  fmt.Println("test02()繼續執行...")
}

 


免責聲明!

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



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