- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
到目前为止,我一直避免使用 log.Fatal
,但我最近偶然发现了这些问题; code-coverage和 tests-using-log-fatal .
100 个代码覆盖率问题中的一条评论说:
... In the vast majority of cases
log.Fatal
should be only be used in main, or init functions (or possibly some things meant to be called only directly from them)"
这让我思考,所以我开始查看 Go 提供的标准库代码。有很多例子,库中的 test 代码使用 log.Fatal
看起来不错。测试代码之外还有几个例子,比如net/http
,如下图:
// net/http/transport.go
func (t *Transport) putIdleConn(pconn *persistConn) bool {
...
for _, exist := range t.idleConn[key] {
if exist == pconn {
log.Fatalf("dup idle pconn %p in freelist", pconn)
}
}
...
}
如果最好的做法是避免使用 log.Fatal
,为什么在标准库中使用它,我本来希望只返回一个错误。调用 os.Exit
并没有为应用程序提供任何清理机会,这对库的用户来说似乎是不公平的。
我可能很天真,因此作为一种更好的做法,我的问题似乎是调用可以恢复的 log.Panic
并且我理论上长期运行的稳定应用程序可能有机会从骨灰。
那么关于何时应该使用 log.Fatal,Go 的最佳实践会说什么?
最佳答案
可能只有我一个人,但这里是我使用 log.Fatal
的方式。根据 UNIX 约定,遇到错误的进程应尽早失败,并使用非零退出代码。这引导我遵循以下准则,以便在……
log.Fatal
func init()
中都会发生错误,因为这些错误分别发生在处理导入时或调用主 func 之前。相反,我只做不直接影响库或 cmd 应该做的工作单元的事情。例如,我设置了日志记录并检查我们是否有一个健全的环境和参数。如果我们有无效的标志,就不需要运行 main ,对吧?如果我们不能提供适当的反馈,我们应该尽早告知。cp
的实现,并且它开始是非交互的并且递归地复制一个目录。现在,假设我们在目标目录中遇到一个与要复制到那里的文件同名(但内容不同)的文件。由于我们不能要求用户决定要做什么,也不能复制这个文件,所以我们遇到了问题。因为当我们以退出代码 0 结束时,用户会假设源目录和目标目录是精确的副本,所以我们不能简单地跳过有问题的文件。但是,我们不能简单地覆盖它,因为这可能会破坏信息。这是我们无法从用户的显式请求中恢复的情况,因此我将使用 log.Fatal
来解释这种情况,从而遵循尽早失败的原则。<关于go - Go 包是否应该使用 log.Fatal 以及何时使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33885235/
使用Suitecrm 7.9.1 每当我尝试创建销售线索时(即提交创建销售线索表格后),我都会遇到以下错误。 每当我尝试导入csv文件时,都会遇到相同的错误。仅在实时服务器上发生此错误 Fatal e
Closed. This question is not reproducible or was caused by typos。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-to
我想在QNX上运行GoogleTestLibrary吗? 但是我收到此错误消息? ldd:FATAL: Could not load library libgtest.so.0 首先,我使用make命
尝试编译代码时,IDE 中显示的 fatal error 和非 fatal error 之间的主要区别是什么? 在这两种情况下,编译器都会显示一条错误消息,并且不会编译程序。 fatal error
当一个人试图编译代码时,在 IDE 中显示的 fatal error 和非 fatal error 之间的主要区别是什么? 在这两种情况下,编译器都会显示一条错误消息,并且程序不会被编译。 fatal
这个程序发出app: 2015/10/24 11:28:15 example.go:22: open some-crazy-non-existent-file: no such file or dir
因此,我正在从事一个项目,但是由于不断收到错误和警告,所以我遇到了一个问题。我对PHP还是很陌生,所以要保持柔和。使用PHP 5.5可以正常运行该程序。但是,当我在PHP 5.6中运行该程序时,会收到
在 WiX 安装程序中 - 如何自定义或覆盖 fatal error 对话框 ()?我想显示详细的错误消息而不是默认设置失败消息。 选项: 是否可以在 WiX 中调整 fatal error 对话框的
我正在尝试通过 Android 工具 > 重命名应用程序包 在 eclipse 中重命名我的 android 应用程序包。它正在生成错误说 A Fatal error occurred while p
我正在使用 Ubuntu 13.10 x64,我正在做一些开发人员正在使用 Windows 的项目,我最近将 git config core.eol 更改为“lf”和 core .autocrlf 为
嗯..世界上的每个服务都可以连接到我的动物园管理员,除了 kafka。下面是我在 server.properties 文件中的连接字符串 zk.connect=1.dzk.syd.druid.neo.
我正在 Java EE 7 中尝试一些东西,我已经构建了一个示例应用程序,可以在此处找到 https://github.com/kenparker/moviplex7.git . 在此过程中,我了解到
我正在尝试使用 bitbucket 中的 ssh 克隆我的存储库,但是每当我克隆存储库时,我都会得到: Connection to bitbucket.org closed by remote hos
该代码包括从一系列数字创建一个数组,以及第三个参数,其中它指示数字的步长,如果它的步长为 2,例如它来自 [1,3, 5] 代码工作正常,除非我以负数作为参数传递 step,例如NumberRange
我正在尝试在我的 ubuntu 中运行一个简单的 git pull 命令。直到几天前,它还可以完美地工作。不是它显示致命:无法访问“https://xxxxxx@bitbucket.org/repon
我知道已经有人问过类似的问题。 但是,我认为我的问题是由于我之前犯的一个错误,因此有所不同:让我解释一下。 一切都如我所愿顺利进行: git add . 我本地存储库中的所有文件。 git commi
我在尝试执行 Jenkins 作业时看到错误。 git 版本 1.8.3.1 Jenkins 2.46.2.1-滚动 我尝试将 git 升级到更高版本,但仍然通过关注 How to install l
Image of the output in the browser 我正在离线处理一个项目。我有一个名为 index.php 的文件。 现在我想在可以编辑的浏览器 sp 中启动。 但是当我尝试通过
我正在AWS的Linux机器上运行RServer Studio。 我尝试安装ModelMetrics的依赖项caret,并收到此错误: auc_.cpp:2:10: fatal error: omp.
我似乎没有重复发帖,所以这是详细信息... 当我使用 XOM(XML 对象模型,Java 库)中的非静态方法 Builder.build() 解析文档时,在 Eclipse 控制台中我得到: [Fat
我是一名优秀的程序员,十分优秀!