GO語言使用之Error處理
阿新 • • 發佈:2018-11-01
一、為什麼需要處理錯誤?
1、從案列引出error處理
package main
import (
"fmt"
)
func test() {
num1 := 10
num2 := 0
res := num1 / num2
fmt.Println("res=", res)
}
func main() {
test()
fmt.Println("下面的程式碼和邏輯...")
}
案列分析:
程式碼因為執行到 num/0 的因此發生了 panic : runtime error 導致整個程式崩潰. 但是在實際開發中,我們希望:如果出現panic, 給管理員一個預警,但是程式還執行.-> 錯誤處理機制。
2、錯誤處理的好處
進行錯誤處理後,程式不會輕易掛掉,如果加入預警程式碼,就可以讓程式更加的健壯。
二、基本介紹
1、Go語言追求簡潔優雅,所以,Go語言不支援傳統的 try…catch…finally 這種處理。
2、Go中引入的處理方式為:defer, panic, recover
3、這幾個異常的使用場景可以這麼簡單描述:Go中可以丟擲一個panic的異常,然後在defer中通過recover捕獲這個異常,然後處理
三、使用defer 和 recover來處理錯誤
// 使用defer 和 recover來處理錯誤
func ErrorDemo() (errCount int ){
defer func() {
if err := recover(); err != nil {
//說明err有錯誤
fmt.Println("傳送簡訊,郵件給管理員...", err)
errCount++
}
}()
num1 := 10
num2 := 0
res := num1 / num2
fmt.Println("res=", res)
return
}
四、自定義錯誤
Go程式中,也支援自定義錯誤, 使用errors.New 和 panic 內建函式。
1、errors.New(“錯誤說明”) , 會返回一個error型別的值,表示一個錯誤
2、panic內建函式 ,接收一個interface{}型別的值(也就是任何值了)作為引數。可以接收error型別的變數,輸出錯誤資訊,並退出程式.
// 自定義錯誤
func ErrorDemo2() {
// 測試的panic 是否會被捕獲
defer func() {
err := recover() // 程式不會崩潰
fmt.Println("test defer err=", err)
}()
err := readConfig("config2.ini")
if err != nil {
//我們以後的程式碼,需要去判斷到底是什麼錯誤型別,然後給予不同的處理機制
if err == FILE_NOT_EXIST {
fmt.Println("錯誤為FILE_NOT_EXIST , 處理方式為...", err)
// 如果你希望發生了 FILE_NOT_EXIST, 你認為這個錯誤是致命,你希望丟擲錯誤,並
// 退出程式,就使用panic 完成(前提是你沒有 defer + recover 處理)
panic(err)
} else if err == FILE_IO_ERROR {
fmt.Println("錯誤為FILE_IO_ERROR , 處理方式為...", FILE_NOT_EXIST)
}
//fmt.Println("readconfig err=", err)
} else {
fmt.Println("success")
}
}
func readConfig(fileName string) (err error) {
//假設我們要求這個檔名必須 config.ini , 丟擲一個錯誤
if fileName == "config.ini" {
return nil // 沒錯
} else {
//返回一個自定義的異常
//return errors.New("file not exist")
return FILE_NOT_EXIST
}
}
五、go專案中處理Error