04 錯誤處理

1. error接口

如何在函數中返回錯誤

// 函數返回錯誤的方法: 將error作爲多重返回值中的最後一個
func Foo(param int)(n int, e error)  {
    if param < 0{
        e = errors.New("必須爲正整數")
    }
    n = ^param
    return
}

func main()  {
    n, e := Foo(-4)
    if e != nil{
        fmt.Printf("錯誤處理",e)
    } else {
        fmt.Println(n, e)
        fmt.Printf("使用正常返回值n")
    }
}

自定義錯誤類型

// 自定義error類型
// 定義一個用於承載錯誤信息的類型
type PathError struct {
    Op string
    Path string
    Err error
}

func(e *PathError) Error() string {
    return e.Op + " " + e.Path + " : " + e.Err.Error()
}

func Stat(name string) (fi os.FileInfo, err error)  {
    var stat syscall.Stat_t
    err = syscall.Symlink(name, &stat)
    
    if err != nil{
        return nil, &PathError{"stat", name, err}
    }
    return fileInfoFromStat(&stat, name), nil
}

2. defer

  1. 延遲執行defer後面的函數調用,在包含當前defer語句的函數執行return時執行,
  2. defer後邊必須是函數調用
  3. 當函數中存在多個defer時,按照lifo隊列的順序執行

  

// file 對象打開後的自動關閉
func Copyfile(dstname, srcname string)(written int64, err error)  {
    src, err := os.Open(srcname)
    if err != nil{
        return
    }
    defer src.Close()

    dst, err := os.OpenFile(dstname, os.O_APPEND|os.O_WRONLY, os.ModeAppend)
    if err != nil{
        return
    }
    defer dst.Close()

    return io.Copy(dst, src)
    //return 1, nil
}

func main()  {
    written, err := Copyfile("/Users/aibyte/Documents/code/go/awesomeProject/4錯誤處理/2.txt", "/Users/aibyte/Documents/code/go/awesomeProject/4錯誤處理/1.txt")
    if err != nil{
        fmt.Println(err)
    }
    fmt.Println(written, err)
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章