首頁 > 軟體

Go語言錯誤處理異常捕獲+異常丟擲

2022-02-25 19:01:33

前言:

Go 語言追求簡潔優雅,所以,Go 語言不支援傳統的 try…catch…finally 這種處理。
Go 中引入的錯誤處理方式為:defer, panic, recover,也僅僅是錯處處理的模擬
Go語言的作者認為java等語言的錯誤處理底層實現較為複雜,就實現了函數可以返回錯誤型別以及
簡單的異常捕獲,雖然簡單但是也非常精妙,大大的提高了執行效率。

一、error變數可以做什麼

1.定義一個error變數

①直接new一個

err := errors.New("我是錯誤處理語句")

②實現Error介面

只要實現了Error介面就可以被error型別所接收,列印的時候會直接列印實現介面時,方法返回的字串。

官方介面如下:

type error interface {
    Error() string
}

程式碼如下:

//定義一個結構體
type man struct {
    age int
}
//實現介面
func (a man) Error() string {
    str := "這是一個錯誤介面"
    return str
}
//建立函數返回錯誤型別
func judgeAge() (int, error) {
    var a man
    return 0, a
}
//主函數呼叫
func main() {
    _, e := judgeAge()
    if e!=nil{
        fmt.Println(e)
    }
}

2.錯誤的處理

    將如果錯誤變數不為空,則將錯誤進行捕獲列印,這裡直接列印到了控制檯,可以將錯誤列印到紀錄檔檔案內,為以後系統的維護做保障。

程式碼如下:

package main

import (
    "errors"
    "fmt"
)

func main() {
    err := errors.New("我是錯誤處理語句")
    if err != nil {
        fmt.Println(err)
    }else {
        fmt.Println("沒有錯誤")
    }
    fmt.Println(123)
}

3.做函數返回值

  • 如果函數返回的錯誤型別值不為空,則將其進行列印

程式碼如下:

package main

import (
    "errors"
    "fmt"
)

func test(num1,num2 int) error {
    if num2 == 0 {
        return errors.New("除數為零")
    }
    res := num1 / num2
    fmt.Println("計算結果為=", res)
    return nil

}
func main() {
    err := test(11,0)
    if err!=nil{
        fmt.Println(err)
    }
}

4.做函數引數

一般用作處理錯誤變數,在需要進行錯誤檢驗的時候呼叫函數,不用再進行判斷了

程式碼如下:

func PrintError(err error){
    if err!=nil{
        fmt.Println(err)
    }
}

二、模擬異常的捕獲與丟擲

1.defer簡介

 defer後面定義的東西是在呼叫函數執行完的時候執行的程式碼,一般用於檔案描述符、資料庫物件的關閉(在之前講管道的時候有介紹過)

 defer什麼什麼延時執行

程式碼如下:

func pDefer() {
    defer fmt.Println("hahaha")
    fmt.Println("hello")
}
func main() {
    pDefer()
}
/*
列印結果
    hello
    hahaha
*/

2.使用recover模擬異常的捕獲

程式碼如下:

package main

import (
    "fmt"
)

func test() {
    //使用defer + recover 來捕獲和處理異常(返回錯誤變數)
    //函數執行末尾執行這個匿名函數
     defer func() {
         err := recover() // recover()內建函數,可以捕獲到異常
         if err != nil {  //說明捕獲到錯誤
             fmt.Println(err)
         }
     }()
    num1 := 10
    num2 := 0
    res := num1 / num2
    fmt.Println("計算結果為=", res)

}
func main() {
    test()
}

3.使用panic主動丟擲錯誤

異常的捕獲,使程式還能夠正常的執行,如果有致命錯誤就需要進行錯誤的丟擲了,也就是宕機,不到迫不得已千萬不要使用這個函數,有可能會造成大量資料的丟失

程式碼如下:

package main

import (
    "errors"
    "fmt"
)

func test() error {
    num1 := 10
    num2 := 0
    if num2 == 0 {
        return errors.New("除數為零")
    }
    res := num1 / num2
    fmt.Println("計算結果為=", res)
    return nil

}


func main() {
    //無論err是否為空,都進行程式的終止
     panic(test())//內建函數2,引數使一個interface介面
}

執行結果:

總結:

Go語言雖然沒有一個較為成熟的異常捕獲機制,但是其精簡的錯誤處理仍舊能夠滿足其需求,減少錯誤的處理大大的加快了我們的開發效率,程式碼的執行效率。

到此這篇關於Go語言錯誤處理異常捕獲+異常丟擲的文章就介紹到這了,更多相關Go語言異常捕獲和異常丟擲內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com