Maison >développement back-end >Golang >Les fonctions « defer » s'exécuteront-elles après un appel « log.Fatalln() » dans Go ?

Les fonctions « defer » s'exécuteront-elles après un appel « log.Fatalln() » dans Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-07 19:44:14437parcourir

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

Fonctions différées et appels log.Fatalln()

Problème :

Considérez le code Go suivant :

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

tpl, err := template.ParseGlob("")
if err != nil {
    log.Fatalln(err)
}

Si template.ParseGlob("") renvoie une erreur, le La fonction db.Close() sera-t-elle appelée ?

Réponse :

Non, les fonctions différées ne seront pas exécutées dans ce scénario.

Explication :

log.Fatalln() est une fonction de journalisation qui imprime un message d'erreur puis appelle os.Exit(1) pour terminer le programme immédiatement. Voici une répartition :

  • log.Fatalln() est équivalent à log.Print() suivi de os.Exit(1).
  • os.Exit() entraîne le programme à quittez avec le code d'état spécifié (dans ce cas, 1 en cas d'échec).
  • Les fonctions différées (telles que db.Close()) ne sont pas exécutées lorsque os.Exit() est appelé.

Dans l'extrait de code, si l'appel à template.ParseGlob("") échoue et que log.Fatalln() est déclenché, le programme se terminera immédiatement. En conséquence, la fonction différée db.Close() ne sera pas exécutée, laissant potentiellement la connexion à la base de données ouverte.

Démonstration :

Pour illustrer ce comportement, le le code suivant peut être exécuté :

package main

import (
    "log"
    "os"
)

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

L'exécution de ce code entraînera la journalisation du message d'erreur et la fermeture immédiate du programme, sans qu'aucune fonction différée ne soit exécuté.

Évitement :

Pour éviter les problèmes liés à des ressources mal fermées ou à des tâches non gérées, envisagez d'utiliser log.Println() pour la journalisation des erreurs et la gestion des erreurs avec élégance sans mettre fin au programme.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn