英文:
Are deferred functions called when calling log.Fatalln?
问题
db, err := sql.Open("postgres", "…")
if err != nil {
log.Fatalln(err)
}
defer db.Close()
tpl, err := template.ParseGlob("")
if err != nil {
log.Fatalln(err)
}
如果template.ParseGlob("")
返回一个错误,db.Close()
是否仍然会被调用?
英文:
db, err := sql.Open("postgres", "…")
if err != nil {
log.Fatalln(err)
}
defer db.Close()
tpl, err := template.ParseGlob("")
if err != nil {
log.Fatalln(err)
}
If template.ParseGlob("")
returns an error, is db.Close()
still being called?
答案1
得分: 34
不,延迟函数不会被执行。
这是log.Fatal的描述:
Fatal等同于Print()后调用os.Exit(1)。
log.Fatal
调用了os.Exit
,其描述在这里:
Exit会导致当前程序以给定的状态码退出。
按照惯例,代码零表示成功,非零表示错误。
程序立即终止,延迟函数不会被执行。
如果你真的需要在程序结束之前正确关闭资源或执行一些任务,那么不要使用log.Fatal
。
英文:
No, the deferred functions aren't run.
Here's the description of log.Fatal :
> Fatal is equivalent to Print() followed by a call to os.Exit(1).
log.Fatal
calls os.Exit
, whose description is here :
> Exit causes the current program to exit with the given status code.
> Conventionally, code zero indicates success, non-zero an error. The
> program terminates immediately; deferred functions are not run.
If you really need to properly close resources or do some tasks before the program finishes, then don't use log.Fatal
.
答案2
得分: 4
如果你想要延迟函数被考虑,请使用"log.Panic"、"log.Panicf"或"log.Panicln"。
英文:
If you want deferred functions to be considered use "log.Panic", "log.Panicf" or "log.Panicln"
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论