登录
首页 >  Golang >  Go问答

如何正确检查plugin.Open返回的错误类型

来源:stackoverflow

时间:2024-04-10 11:00:35 470浏览 收藏

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《如何正确检查plugin.Open返回的错误类型》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

问题内容

我想知道如何检查plugin.open返回的错误类型,例如:

88698564714​​4

如果错误是:我想做一些不同的事情:

plugin.open("./module.so"): realpath failed

这基本上意味着该文件不存在。

期望结果的示例:

package main

import "plugin"

func main() {
  _, err := plugin.Open("./module.so")
  if err.Error() == "plugin.Open(\"./module.so\"): realpath failed" {
    // do something different here
  } else {
    log.Fatal(err)
  }
}

我传递给 plugin.open 的字符串可以有其他值,因此它需要比这更智能的东西。

提前致谢。


解决方案


检查 the code 中的 plugin.open() 显示该包调用了一些 c 代码来确定路径是否存在。如果没有,它会返回一个简单的错误值。特别是,该包没有定义任何可以比较的哨兵错误,也没有返回其自己的携带自定义元数据的 error 接口的具体实现者。这是产生该错误的代码:

return nil, errors.new(`plugin.open("` + name + `"): realpath failed`)

errors.newerror 接口的基本实现,不允许传递任何附加信息。与标准库中返回错误(例如 os 包中的路径不存在错误)的其他位置不同,在此实例中您无法获取此类元数据。

先检查模块文件是否存在

我的偏好是在尝试加载模块之前使用 os 包提供的本机功能来验证该模块是否存在:

modulepath := "./module.so"
if _, err := os.stat(modulepath); os.isnotexist(err) {
    // do whatever is required on module not existing
}

// continue to load the module – can be another branch of the if block
// above if necessary, depending on your desired control flow.

比较错误值的子集

您还可以使用 strings.contains 在返回的错误值中搜索值 realpath failed这不是一个好主意,以防将来字符串发生变化,因此,如果您采用这种模式,至少您应该确保对其进行严格的测试(即使这样,它仍然不是很好)。

_, err := plugin.Open("./module.so")
if err != nil {
    if strings.Contains(err.Error(), "realpath failed") {
        // Do your fallback behavior for module not existing
        log.Fatalf("module doesn't exist")
    } else {
        // Some other type of error
        log.Fatalf("%+v", err)
    }
}

理论要掌握,实操不能落!以上关于《如何正确检查plugin.Open返回的错误类型》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>