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

标签 go error-handling

我正在尝试确定 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 指向常规文件而不是符号链接(symbolic link),readlink 应该生成 EINVAL,但是我的 err.Err == os.ErrInvalid 检查失败并记录以下内容:

2019/03/28 12:04:42 ResolveLinks 错误:readlink foo:参数无效

我应该解压 PathError,但是然后呢?比较错误字符串?

我注意到 os 模块有一些函数可以匹配错误类型,比如 os.IsNotExist ,但我没有看到所有可能的错误代码。

最佳答案

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

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

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

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

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

关于go - 从 PathError 中获取 errno 值的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55405324/

相关文章:

json - API规范转换器使用golang

google-app-engine - 使用 Go 在 Google Cloud Storage 中压缩文件夹的最佳方法?

json - Golang Unmarshal slice of slice of ints

asp.net - 服务器上出现错误不能为空参数名称root

windows - Jupyter笔记本: ModuleNotFoundError No Module named 'pyomo'

使用 1.5.x 进行交叉编译 - 输出文件被覆盖

rest - 如何在 golang 中处理未设置值的补丁请求

python - 在使用 python 进行 GUI 自动化期间鼠标未单击

javascript - 为什么即使我已经执行过此测试,仍然期望我的函数抛出错误?

php - 如何在Symfony 4中创建登录页面而没有 “InvalidConfigurationException”错误?