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)
}
原文地址:https://www.cnblogs.com/zhangjian0092/p/12357276.html