当我ioutil用来读取文件时,它可能会返回错误.但是,如果我想过滤一些错误代码,我该怎么办?
res, err := ioutil.ReadFile("xxx")
if err != nil {
fmt.Println(err.Error())
}
...
Run Code Online (Sandbox Code Playgroud)
在上面的代码段中,当文件没有权限时,fmt.Println(err.Error())将打印"open xxxxx: permission denied.如果我想捕获此类错误,我怎么知道文件读取失败,因为权限被拒绝?
我应该搜索err.Error()字符串permission denied- 这看起来很不合适.有没有更好的方法?
提前致谢.
更新
在尝试了@Intermernet解决方案之后,我发现它不会命中case os.ErrPermission,它会命中default并打印"open xxx: Permission denied".
@Aedolon解决方案没问题,os.IsPermission(err)可以通过权限拒绝判断文件是否失败.
根据当前的API,ioutil.ReadFile不保证任何特定的行为,除了它将err == nil在成功时返回.即使是syscall包实际上也不能保证特定的错误.
当前的ioutil.ReadFile使用实现os.Open,将*os.PathError在未能打开文件时返回,不会os.ErrPermission或其他任何内容.os.PathError包含一个Err也是错误的字段- 在这种情况下,a syscall.Errno.字符串"permission denied"是从私有的错误消息表中生成的,它既是体系结构,也是特定于实现的.在我的Windows机器中,它说"访问被拒绝".
AFAIK,正确的方法是使用os.IsPermission(err),true在缺少权限的情况下将返回.