通过电话后获得操作错误的惯用方法

时间:2014-06-04 17:26:26

标签: go

如果我这样做

s, err := os.Stat(path)

err != nil我需要知道文件是否存在而不是我没有权限访问它,等等。如何获取基础错误代码?阅读os包文档似乎表明我读了错误字符串的文本 - 当然不是吗?

2 个答案:

答案 0 :(得分:5)

FUZxxl says

来自os.Stat documentation

  

Stat返回描述指定文件的FileInfo如果出现错误,则其类型为*PathError

PathError记录在案on the same page,声明它包含导致错误的操作,导致错误的文件的路径以及底层系统的错误。如果在调用os.Stat时未找到该文件,则返回的错误将如下所示:

&PathError{"stat", "/your/file", syscall.Errno(2)}

由于底层错误本质上取决于您使用的操作系统,因此您唯一能做的就是 理解PathError.Err。对于UNIX系统,syscall包具有syscall.Stat之类的系统调用返回的Errno error type。您可以将此值与constants in the syscall package进行比较,并处理错误(Click to play):

stat, err := os.Stat(file)

if perr, ok := err.(*os.PathError); ok {
    switch perr.Err.(syscall.Errno) {
         case syscall.ENOENT: fmt.Println("No such file or directory.")
         default: panic("Unknown error")
    }
}

执行此操作的较短方法是使用os.IsNotExist pretty much the above 并且,最重要的是,平台无关:

stat, err := os.Stat(file)

if err != nil && os.IsNotExist(err) {
    // ...
}

答案 1 :(得分:0)

另一个答案很棒,但我想添加有关此建议的注释:

stat, err := os.Stat(file)
if err != nil && os.IsNotExist(err) {
   // ...
}

我发现在很多情况下,我需要根据不同的情况采取不同的行动 每个测试,所以实际上你在这里有三个分支。这是我使用的代码 那个:

stat, err := os.Stat(file)

if os.IsNotExist(err) {
   // branch one
} else if err != nil {
   // branch two
}

// branch three