到目前为止我一直避免使用 log.Fatal
,但我最近偶然发现了这些问题; 代码覆盖 和 测试 - 使用日志致命。
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?