我正在尝试确定os.PathError
是由于EINVAL
还是ENOENT
造成的。我该如何正确地做出决定呢?
res, err := os.Readlink(fpath)
if err, ok := err.(*os.PathError); ok {
if err.Err == os.ErrInvalid {
// This path here. What's the correct check?
return fpath
}
log.Printf("ResolveLinks error: %s", err)
return ""
}
log.Printf("Resolved: %s to %s", fpath, res)
return res
如果fpath
指向常规文件而不是符号链接,则readlink应生成EINVAL
,但我的err.Err == os.ErrInvalid
检查失败,并记录以下内容:
2019/03/28 12:04:42 ResolveLinks error: readlink foo: invalid argument
我应该打开PathError的,但是然后呢?是否比较错误字符串?
我注意到os模块有一些特定的函数来匹配错误类型,比如os.IsNotExist
,但是我没有看到所有可能的错误代码的函数。
发布于 2019-03-29 03:34:07
err.Err
的类型是syscall.Errno
,这是可以转换为int的整数类型。在Ubuntu上运行此代码会产生错误代码22:
if serr, ok := err.Err.(syscall.Errno); ok {
fmt.Println(int(serr))
}
请记住,我不知道这种检查是否是跨平台的。
如果你只是想检查文件是不是符号链接,你可以使用Lstat来获取FileInfo
结构并进行检查:
fi.Mode() & os.ModeSymlink != 0
发布于 2019-03-29 03:26:04
我发现错误的字符串将允许与错误类型匹配,但我不确定(完全)这是否适用于跨平台甚至跨语言环境。
if err, ok := err.(*os.PathError); ok {
//EINVAL
if err.Err.Error() == "invalid argument" {
…
// - OR -
//ENOENT
if err.Err.Error() == "no such file or directory" {
…
}
https://stackoverflow.com/questions/55405324
复制相似问题