Go 學習筆記07.錯誤處理

package main

import "errors"
import "fmt"



// go語言的慣例,最有一個返回參數 需要一個錯誤類型
// 如果傳入的值爲42 則觸發異常

func f1(arg int) (int, error) {
    if arg == 42 {
        // 使用 errors.New("錯誤信息") 來定義一個錯誤
        return -1, errors.New("can't work with 42")
    }
    // nil 表示沒有錯誤
    return arg + 3, nil
}


// 自定義錯誤類型
// 需要一個結構體,並編寫它的方法Error()
type argError struct {
    arg  int
    prob string
}
// 給結構體argError實現Error方法,返回值爲字符串類型
func (e *argError) Error() string {
    // fmt.Sprintf不是打印,是生成一段字符串
    return fmt.Sprintf("%d - %s", e.arg, e.prob)
}


func f2(arg int) (int, error) {
    if arg == 42 {
        return -1, &argError{arg, "can't work with it"}
    }
    return arg + 3, nil
}

func main() {

    // 遍歷循環切片 [7 42]
    for _, i := range []int{7, 42} {
        // 注意這個if語句,它竟然可以先賦值;再比較
        //  r, e := f1(i) 賦值 
        //  ;
        //  比較 e != nil
        //  如果不等於nil,說明報錯了,打印 failed,並輸出e錯誤信息
        if r, e := f1(i); e != nil {
            fmt.Println("f1 failed:", e)
        } else {
            fmt.Println("f1 worked:", r)
        }
    }
    for _, i := range []int{7, 42} {
        if r, e := f2(i); e != nil {
            fmt.Println("f2 failed:", e)
        } else {
            fmt.Println("f2 worked:", r)
        }
    }

    // 如果觸發錯誤了,還想繼續使用那個值做其他事情
    // 可以使用類型斷言 ,類型斷言可以看 https://www.jianshu.com/p/787cf3a41ccb
    // 還有一個類型測試,這個是不確定錯誤類型的時候使用
    // 類型斷言 是已經確定哪一類錯誤類型
    // 視頻教程 https://www.bilibili.com/video/BV1aJ411P7Np?from=search&seid=2830782091279317804
    _, e := f2(42)
    if ae, ok := e.(*argError); ok {
        fmt.Println(ae.arg)
        fmt.Println(ae.prob)
    }
}
f1 worked: 10
f1 failed: can't work with 42
f2 worked: 10
f2 failed: 42 - can't work with it
42
can't work with it
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章