在 Golang 中导入模块时如何捕获错误?

2024-03-17

在golang中,当我导入一个模块时,它的init()被执行(我假设在main()之前?),这个函数中可能会产生一些错误。我如何捕获这些错误并在我自己的代码中处理它们?


正如你所知,Go 中的错误是返回值。由于 init() 不返回任何内容,因此如果出现任何问题,唯一的选择是在 init 中恐慌()。

可以说,在 init 上发生恐慌的包设计得不是很好,尽管这可能有有效的用例。

在这种情况下,recover() 不是一个选项,因为 init 在 main 之前运行。因此,如果您无法编辑有问题的包,那么您就不走运了。

这就是为什么应该谨慎使用恐慌和恢复的原因之一,只有在字面上“恐慌”有意义的情况下才应使用。

@twotwotwo 贡献了以下来自“ effective Go”的引用来描述这一点(对于 init 情况):

如果图书馆确实无法自行设置,可以这么说,恐慌可能是合理的

所以:如果你的 init 函数需要报告错误,那么问问自己该代码是否真的属于 init 或最好保存在其他地方。如果确实必须进行 init,请考虑在包内设置一个错误标志,并记录任何客户端都必须检查该错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Golang 中导入模块时如何捕获错误? 的相关文章

  • 如何在 ECMAScript 6 中导入 JSON 文件?

    如何访问 ECMAScript 6 中的 JSON 文件 以下不起作用 import config from config json 如果我尝试导入 JavaScript 文件 这可以正常工作 https www stefanjudis c
  • golang导入结构体指针

    好的 我有一个主包和一个 http 处理程序包 本质上我想做的是设置一个全局结构 这样我就可以随时调用该结构中的信息 我尝试的示例的基本概要如下 主包导入处理函数 主包调用handlerfunc Handlerfunc 将 http Res
  • 从 Go Slice 中选择一个随机值

    情况 我有一些值 需要从中随机选择一个值 然后我想将它与固定字符串连接起来 到目前为止 这是我的代码 func main create the reasons slice and append reasons to it reasons m
  • 如何使用 golang 和 mgo 库在 mongodb 中创建文本索引?

    我正在尝试对集合进行全文搜索 但为了做到这一点 我需要创建一个文本索引 http docs mongodb org manual tutorial create text index on multiple fields http docs
  • Bash脚本无法执行Go命令

    我正在尝试编写一个 bash 脚本来自动在不同的目录中运行 go get install 相关部分在这里 cd web go get cd web go install cd services go get cd services go i
  • 数据库连接最佳实践

    我有一个使用 net http 的应用程序 我使用 http 注册了一些处理程序 这些处理程序需要从数据库中获取一些内容 然后才能继续编写响应并完成请求 我的问题是连接到该数据库的最佳实践是什么 我希望它能够以每分钟 1 个请求或每秒 10
  • java.lang.NoSuchMethodError:com.fasterxml.jackson.databind.type。使用 apache beam Spark runner 运行 go 示例时

    我想跑grades https github com apache beam tree master sdks go examples gradesapache beam go sdk 提出的示例 在一个主服务器和两个从服务器 spark2
  • 使用 loadtxt 简化多个文件的导入 (Python)

    我想简化使用 loadtxt 导入多个文件的方式 我执行以下操作 rc1 loadtxt 20120701 Gp xr 5m txt skiprows 19 rc2 loadtxt 20120702 Gp xr 5m txt skiprow
  • Go MSSQL 连接

    如何提供 MSSQL 连接 它说它始终与代码相关 即使信息不正确 也不会报错 package main import database sql fmt github com denisenkom go mssqldb log var ser
  • GO并发编程测试

    我试图确保我的并发程序不存在以下情况 僵局 livelock 饥饿 我找到了以下工具http blog golang org race detector http blog golang org race detector 我尝试编译并运行
  • 无法通过键获取 Gorilla 会话值

    我无法通过这种方式从会话中获取价值 它是nil session initSession r valWithOutType session Values key 完整代码 package main import fmt github com
  • 如何将未知字段类型的数据解组为 JSON

    我有这些 结构 type Results struct Gender string json gender Name struct First string json first Last string json last json nam
  • 视频第一帧

    我正在创建一个单页应用程序 后端使用 Golang 前端使用 javascript 我想找到一种使用 Golang 获取视频第一帧的方法 首先 我将 mp4 视频文件上传到服务器 它保存在服务器上 有没有办法使用 Golang 获取该视频的
  • nsq 无法通过连接到 nsqlookupd 来消费消息

    我尝试使用 docker compose 来运行 nsq docker compose yml如下 version 3 services nsqlookupd image nsqio nsq command nsqlookupd ports
  • 在golang中获取TTFB(第一个字节的时间)值

    我正在尝试获取 TTFB 值和 Connect 值 c exec Command curl w Connect time connect TTFB time starttransfer Total time time total o dev
  • 在 Go 中使用电子邮件地址创建证书签名请求 (CSR)

    我尝试使用 crypto x509 包生成 CSR 但没有找到将 emailAddress 字段添加到其主题中的方法 根据文档证书申请 http golang org pkg crypto x509 CertificateRequest结构
  • Go 无法推断赋值中的类型:“non-name on left side of :=”

    该片段按预期工作play golang org p VuCl OKMav http play golang org p VuCl OKMav i 10 next 11 prev i i next 然而这个几乎相同的片段给出了non name
  • 重新插入通道导致死锁

    我有稳定的入站 作业 流 将其输入到无缓冲通道中 我有一个for range循环来迭代项目并处理它们 如果处理该项目失败 我会将项目重新插入通道中 以便稍后重试 问题是当我将项目重新插入通道时 它陷入僵局 我明白为什么会发生这种情况 处理器
  • 只读取选定的列

    谁能告诉我如何仅读取下面每年数据的前 6 个月 7 列 例如使用read table Year Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 2009 41 27 25 31 31 39 2
  • (转)如何使用toml文件?

    正如标题 我想知道如何使用 golang 中的 toml 文件 在此之前 我展示了我的 toml 示例 这样对吗 datatitle enable true userids 12345 67890 datatitle 12345 prop1

随机推荐

  • 将图像图标添加到按钮/标签 Swing

    我知道这个问题已经发布了 但我已经尝试了我发现的所有内容 但没有任何效果 我有一个 Maven 项目 我想在按钮上使用图像 我把图像放在src main res folder Maven clean Maven 安装后 我的所有图像都可以在
  • 对对齐的 malloc 实现的解释

    这不是作业 这纯粹是为了我自己的个人教育 我不知道如何实现对齐的 malloc 所以在网上查找并发现这个网站 https sites google com site ruslancray lab bookshelf interview ci
  • 始终排除在 SVN for Netbeans 中提交的文件夹

    我使用Netbeans 7 0和内置的SVN客户端进行开发 我希望始终从提交 更新中排除某些文件和文件夹 例如 缓存 或 日志 因为它们对于存储库本身并不重要 我没有找到任何设置来执行此操作 而且 Netbeans 也没有在其常见问题解答中
  • MySQL 在没有缓存的情况下增强性能

    我正在使用 MySQL 版本 5 5 14 从 500 万行的表运行以下查询 SELECT P ID P Type P Name P cty X P latlng as lat Y P latlng as lng P cur P ak P
  • JSDoc 和 JavaScript 单例文档

    我有一个 JavaScript 单例定义为 A description here class com mydomain ClassName function constructor lends com mydomain ClassName
  • 带有包含路径和源路径的 CMake - 基本设置

    我正在尝试建立一个看起来像我自己的项目的测试项目 只是为了让事情首先正常工作 它看起来像这样 MainProject inc main h MainProject src main cpp LibProject inc test h Lib
  • Codemagic IOS 构建需要很长时间才能完成

    我正在尝试在 Codemagic 上设置我的 flutter 应用程序 但为 IOS 构建大约需要 40 50 分钟 日志显示是compiling files c and cc 有很多这样的文件正在编译 有没有办法让构建速度更快 我是否缺少
  • 轻量级的 Scala fork join 语法

    尽管即将推出 java 7 标准 fork join 框架 但我正在构建一些语法轻量级的辅助方法 以便客户端并行运行代码 这是一个可运行的 main 方法来说明这个想法 import actors Futures object ForkTe
  • 如何将值从一种形式传递到另一种形式?

    考虑一下我有两个窗口窗体的情况 比如说F1 and F2 使用后F1 我现在已经打电话了F2 ShowDialog 这使得F2也在屏幕上 现在两种形式都可见 我如何从F1 to F2 另外 有一次F2 模态对话框 结束 如何返回数据F1 有
  • Android canvas drawText 文本的 y 位置

    我正在使用 Canvas 创建一个带有一些背景和一些文本的 Drawable 该可绘制对象用作 EditText 内的复合可绘制对象 文本是通过在画布上的 drawText 绘制的 但在某些情况下 我确实对绘制文本的 y 位置存在问题 在这
  • 我从哪里开始组装?

    嘿 我会用 C 语言编程 会一点 Python 和 Pascal 我真的很想学习汇编 我今年 18 岁 高中毕业 编程是 我的爱好 因为学业确实不是什么挑战 我下载了几本关于汇编的书籍 它们是 汇编的艺术 初学者的汇编 完全初学者的汇编和
  • Android 媒体记录器停止异常

    我正在从 Android 媒体录音机录制视频和音频 我正在检查剪辑长度 如果少于 2 秒 请删除它 但问题是 如果我从文件路径检查文件的持续时间 MediaRecorder 每次抛出异常后都会抛出异常 即使我录制 10 秒的音频 但是当我评
  • 为什么空基类优化 (EBO) 在 MSVC 中不起作用?

    为什么空基类优化 EBO 在Visual C 中没有得到充分应用 如果我有很多基类 我有什么办法可以帮助编译器进行这种优化吗 include
  • iOS UITesting 如何关闭 Popover(iPad Popover 不是警报样式)

    我有一个非常复杂的应用程序 有很多视图和弹出窗口 用于快速选择条目 我无法关闭弹出窗口 我尝试了很多类似的 点击窗口中的坐标 app otherElements PopoverDismissRegion 击中后面的元素 弹出窗口 根本不可点
  • Python KafkaConsumer 从某个时间戳开始消费消息

    我计划跳过主题的开头 只读取从某个时间戳到结束的消息 关于如何实现这一目标有任何提示吗 我猜你正在使用kafka python https github com dpkp kafka python https github com dpkp
  • 如何将列表视图放置在 SingleChildScrollView 中但防止它们单独滚动?

    我有一个像这样的小部件树 SingleChildScrollView Column Container ListView or GridView 问题是 当我的小部件树如上所示时 它会给我错误 需要油漆 所以我像这样改变我的小部件树 Col
  • C# 十六进制转ascii

    我正在尝试使用以下命令将十六进制字符串转换为 ASCII public void ConvertHex String hexString StringBuilder sb new StringBuilder for int i 0 i lt
  • 如何从 Android 上的 sqlite 数据库中删除旧行?

    我有一个参数 用户可以在其中选择应存储数据的时间段 我读到了days多变的 记录添加到数据库时的日期和时间存储在KEY DATE ADDED 它的创建方式如下 SimpleDateFormat dateFormat new SimpleDa
  • git-ftp 在 repo 根目录中的文件夹和文件名中添加尖号 (#)

    I use Git ftp https github com git ftp git ftp scripts to uploading of my project via FTP on shared hosting But there is
  • 在 Golang 中导入模块时如何捕获错误?

    在golang中 当我导入一个模块时 它的init 被执行 我假设在main 之前 这个函数中可能会产生一些错误 我如何捕获这些错误并在我自己的代码中处理它们 正如你所知 Go 中的错误是返回值 由于 init 不返回任何内容 因此如果出现