首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从PathError中获取errno值的正确方法

从PathError中获取errno值的正确方法
EN

Stack Overflow用户
提问于 2019-03-29 03:17:28
回答 2查看 352关注 0票数 1

我正在尝试确定os.PathError是由于EINVAL还是ENOENT造成的。我该如何正确地做出决定呢?

代码语言:javascript
复制
    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,但是我没有看到所有可能的错误代码的函数。

EN

回答 2

Stack Overflow用户

发布于 2019-03-29 03:34:07

err.Err的类型是syscall.Errno,这是可以转换为int的整数类型。在Ubuntu上运行此代码会产生错误代码22:

代码语言:javascript
复制
    if serr, ok := err.Err.(syscall.Errno); ok {
        fmt.Println(int(serr))
    }

请记住,我不知道这种检查是否是跨平台的。

如果你只是想检查文件是不是符号链接,你可以使用Lstat来获取FileInfo结构并进行检查:

代码语言:javascript
复制
fi.Mode() & os.ModeSymlink != 0
票数 1
EN

Stack Overflow用户

发布于 2019-03-29 03:26:04

我发现错误的字符串将允许与错误类型匹配,但我不确定(完全)这是否适用于跨平台甚至跨语言环境。

代码语言:javascript
复制
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" {
       …
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55405324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档