延迟函数在调用log.Fatalln时被调用吗?

huangapple go评论72阅读模式
英文:

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.

Demonstration

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"

huangapple
  • 本文由 发表于 2013年7月27日 02:35:02
  • 转载请务必保留本文链接:https://go.coder-hub.com/17888610.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定