錯誤處理機制:
先看一段代碼:看看輸出什么?
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()繼續執行...")
}