1.error 接口
Go 語言通過 error 接口實現錯誤處理的標準模式,通過使用函數返回值列表中的最後一個
值返回錯誤信息,將錯誤的處理交由程序員主動進行處理
package main
import (
"errors"
"fmt"
)
//返回值 怎麼定義錯誤類型error
//怎麼創建錯誤類型的值,errors.New(),fmt.Errorf() 生成一個錯誤對象
//無錯誤nil
func division(a, b int) (int, error) {
if b == 0 {
return -1, errors.New("division is zero ")
}
return a / b, nil
}
func main() {
fmt.Println(division(1, 2))
if v, err := division(1, 0); err == nil {
fmt.Println(v)
} else {
fmt.Println(err)
}
e := fmt.Errorf("Error: %s", "division is zero")
fmt.Printf("%T,%v \n", e, e)
}
2. defer
defer 關鍵字用戶聲明函數,不論函數是否發生錯誤都在函數執行最後執行(return 之前),
若使用 defer 聲明多個函數,則按照聲明的順序,先聲明後執行(堆)
常用來做資源釋放,記錄日誌等工作
package main
import "fmt"
func main() {
//defer 延遲執行
//在函數退出的時候執行而且符合堆棧 先進後出
defer func() {
fmt.Println("defer is 01")
}()
defer func() {
fmt.Println("defer is 02")
}()
fmt.Println("is ok")
}
3.panic 與 recover 函數
go 語言提供 panic 和 recover 函數用於處理運行時錯誤,當調用 panic 拋出錯誤,中斷原 有的控制流程,常用於不可修復性錯誤。recover 函數用於終止錯誤處理流程,僅在 defer
語句的函數中有效,用於截取錯誤處理流程,recover 只能捕獲到最後一個錯誤
package main
import "fmt"
//適用於 別人使用了panic 你想主動的抓取錯誤信息,通過error信息返回 就可以使用這種方法
//用第三方庫想抓取錯誤信息 一般使用這種方式
func test() (err error) {
defer func() {
if e := recover(); e != nil {
err = fmt.Errorf("%v", e)
}
}()
panic("error:no ok")
return
}
func main() {
err := test()
fmt.Println(err)
//panic 拋出異常直接退出
//recover 是有錯誤的時候拋出錯誤或者做修復使用,會接受panic的錯誤並拋出
defer func() {
if err := recover(); err != nil {
fmt.Printf("%T %v", err, err)
}
}()
fmt.Println("start")
panic("error")
fmt.Println("stop")
}