来自 100 个代码覆盖率问题的评论之一说:
...在绝大多数情况下log.Fatal应该只在 main 或 init 函数中使用(或者可能是一些只能直接从它们调用的东西)”
这让我思考,所以我开始查看 Go 提供的标准库代码。库中的测试代码使用了很多示例,这些示例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哪些可以恢复,并且我理论上的长期运行稳定的应用程序可能有机会从灰烬中崛起。
那么对于 Go 什么时候应该使用 log.Fatal 的最佳实践是什么?
守着一只汪
蓝山帝景
相关分类