首頁 > 後端開發 > Golang > Go 中呼叫 `log.Fatalln()` 後會執行 `defer` 函數嗎?

Go 中呼叫 `log.Fatalln()` 後會執行 `defer` 函數嗎?

Barbara Streisand
發布: 2024-12-07 19:44:14
原創
462 人瀏覽過

Will `defer` functions execute after a `log.Fatalln()` call in Go?

延遲函數與log.Fatalln() 呼叫

問題:

考慮以下Go 程式碼:

db, err := sql.Open("postgres", "…")
if err != nil {
    log.Fatalln(err)
}
defer db.Close()

tpl, err := template.ParseGlob("")
if err != nil {
    log.Fatalln(err)
}
登入後複製

考慮以下Go 程式碼:

如果template.ParseGlob("")回傳錯誤,會呼叫 db.Close() 函數嗎?

答案:

不,在這種情況下不會執行延遲函數。

說明:
  • log.Fatalln()是一個日誌函數,它會列印錯誤訊息,然後呼叫 os.Exit(1) 立即終止程式。細分如下:
  • log.Fatalln() 相當於 log.Print() 後面跟著 os.Exit(1)。
os.Exit() 導致程式以指定的狀態碼退出(在本例中,1 表示失敗)。

延遲函數(例如 db.Close())是呼叫 os.Exit() 時不運作。

程式碼片段中,如果呼叫 template.ParseGlob("") 失敗並觸發 log.Fatalln(),程式將退出立即地。因此,延遲函數 db.Close() 將不會被執行,從而可能使資料庫連線保持開啟。

示範:
package main

import (
    "log"
    "os"
)

func main() {
    defer os.Exit(1) // Exit the program with status code 1
    log.Fatalln("Program terminated early")
}
登入後複製

為了說明此行為,可以執行以下程式碼:

執行此程式碼將導致記錄錯誤訊息並退出程式立即執行,而不執行任何延遲函數。

避免:為了避免不正確關閉資源或未處理任務的問題,請考慮使用log.Println() 進行錯誤日誌記錄並在不終止程序的情況下優雅地處理錯誤。

以上是Go 中呼叫 `log.Fatalln()` 後會執行 `defer` 函數嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板