首页 > 解决方案 > 从 PathError 中获取 errno 值的正确方法

问题描述

我正在尝试确定 an 是否os.PathError是由于 anEINVALENOENT. 我如何正确地做出这个决定?

    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,但我没有看到所有可能的错误代码。

标签: goerror-handling

解决方案


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

    if serr, ok := err.Err.(syscall.Errno); ok {
        fmt.Println(int(serr))
    }

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

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

fi.Mode() & os.ModeSymlink != 0

推荐阅读