第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

全部開發(fā)者教程

Go 入門教程

首頁 慕課教程 Go 入門教程 Go 入門教程 36 Go 語言中的錯誤和異常處理

Go 語言中的錯誤和異常處理

在 Go 語言中沒有與 Java 或者 .NET 類似的異常處理機(jī)制。Go 語言的開發(fā)者認(rèn)為類似的異常處理已經(jīng)被過多的使用了,這樣的異常機(jī)制過度依賴上層代碼對異常的處理,如果上層代碼對異常的處理不到位會使程序出一些不易排查的BUG。所以為了讓開發(fā)者能夠重視并正確的處理每一個可能會出現(xiàn)異常的函數(shù),Go語言采用返回值的形式來返回錯誤。這一機(jī)制,既可以讓開發(fā)者真正理解錯誤處理的含義,也可以大大降低程序的復(fù)雜度。

1.error 接口

error 是系統(tǒng)自帶的一個接口類型的自定義類型。

代碼如下:

type error interface {
    Error() string
}

2. errors 包

Tips:包的概念會在后文的Go語言中的包管理中詳細(xì)介紹

errors 包中包含了一個實現(xiàn)了 error 這個接口的結(jié)構(gòu)體類型 errorString。我們可以直接使用包中的方法來自定義一些錯誤,從而返回我們希望被上層代碼處理的錯誤信息。

代碼示例:

package main

import (
    "errors"
    "fmt"
)

func main() {
    t, err := divide(2, 0)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(t)
    }
}

func divide(a, b int) (int, error) {
    if b == 0 {
        return 0, errors.New("除數(shù)不能為0")
    }
    return a / b, nil
}
  • 第 19 行:使用 errors.New 自定義一個除數(shù)不能為0的錯誤;
  • 第 10~12 行:若除數(shù)為零,則輸出這個錯誤。

執(zhí)行結(jié)果:

image.png

3. 異常處理

如果你調(diào)用的方法的開發(fā)者不夠仔細(xì),并沒有將所有的異常都考慮到并作為錯誤返回,那你的程序可能就會被其影響而崩潰。對這種情況,GO 語言提供了一個叫recover()的函數(shù),用于處理這種問題。一般常用于服務(wù)啟動的入口函數(shù),因為網(wǎng)絡(luò)等外部因素,極有可能會導(dǎo)致程序異常,這些異常就需要這個函數(shù)來捕獲。

代碼示例:

package main

import (
    "fmt"
)

func main() {
    defer func() {
        err := recover()
        if err != nil {
            fmt.Println("程序運(yùn)行中出現(xiàn)異常:", err)
        }
    }()
    t := divide(2, 0)
    fmt.Println(t)
}

func divide(a, b int) int {
    return a / b
}
  • 第 17 行:在沒有判斷除數(shù)的情況下直接做除法,若除數(shù)為零,程序直接崩潰。
  • 第 8~11 行:在 main 函數(shù)結(jié)束時,獲取執(zhí)行過程中的錯誤,若沒有錯誤者err為nil。

執(zhí)行結(jié)果:

image.png

4. 小結(jié)

本位介紹了 Go 語言中如何使用 errors 來自定義錯誤,如何去使用函數(shù)中返回出來的 error 類型變量,來處理自定義錯誤以及在無法避免的異常出現(xiàn)的時候如何使用recover()來保障程序不崩潰。