16-Goang錯誤處理-defer/panic/recover

errors

Go 語言通過 error 接口實現(xiàn)錯誤處理的標準模式,通過使用函數(shù)返回值列表中的最后一個值返回錯誤信息,將錯誤的處理交由程序員主動進行處理??梢酝ㄟ^ errors 包的 New 方法創(chuàng)建或者通過 fmt.Errorf 方法創(chuàng)建。

package main

import (
    "errors"
    "fmt"
)

// 返回值  怎么定義錯誤類型
// 怎么創(chuàng)建錯誤類型的值,errors.New() fmt.Errorf()
// 無錯誤 nil,
func division(a, b int) (int, error) {
    if b == 0 {
        return -1, errors.New("division by zero")
    }
    return a / b, nil
}

func main() {
    fmt.Println(division(1, 3))
    if v, err := division(1, 0); err == nil {
        fmt.Println(v)
    } else {
        fmt.Println(err)
    }
    e := fmt.Errorf("Error: %s", "division by zero")
    fmt.Printf("%T,%v\n", e, e)
}

defer

defer 關鍵字用戶聲明函數(shù),不論函數(shù)是否發(fā)生錯誤都在最后執(zhí)行(return 之前),若使用 defer 聲明多個函數(shù),則按照聲明的順序,先聲明后執(zhí)行(堆)。

常用來做資源釋放,記錄日志等工作

package main

import "fmt"

func main() {
    // defer 延遲執(zhí)行,最后執(zhí)行
    // 多個defer,和棧差不多,先進后出
    defer func() {
        fmt.Println("defer01")
    }()

    defer func() {
        fmt.Println("defer02")
    }()

    fmt.Println("main over")
}

go 語言提供 panic 和 recover 函數(shù)用于處理運行時錯誤,當調用 panic 拋出錯誤,中斷原有的控制流程,常用于不可修復性錯誤。recover 函數(shù)用于終止錯誤處理流程,僅在 defer語句的函數(shù)中有效,用于截取錯誤處理流程,recover 只能捕獲到最后一個錯誤。

go 語言提供 panic 和 recover 函數(shù)用于處理運行時錯誤,當調用 panic 拋出錯誤,中斷原有的控制流程,常用于不可修復性錯誤。recover 函數(shù)用于終止錯誤處理流程,僅在 defer語句的函數(shù)中有效,用于截取錯誤處理流程,recover 只能捕獲到最后一個錯誤。

panic拋出異常并退出

package main

import "fmt"

func main() {
    fmt.Println("main start")
    panic("errors")
    fmt.Println("main end")
}

recover 對錯誤進行恢復處理

package main

import (
    "fmt"
)

func main() {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println(err)
        }
    }()
    fmt.Println("main start")
    panic("errors panic recover")
    fmt.Println("main end")
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容