九、錯誤處理

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")
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章