Maison développement back-end Golang Parlons des mécanismes courants de journalisation des erreurs dans Golang

Parlons des mécanismes courants de journalisation des erreurs dans Golang

Apr 23, 2023 am 10:08 AM

Golang est un langage en constante évolution, introduisant constamment de nouvelles fonctionnalités et ajoutant davantage de bibliothèques, ce qui en fait le meilleur choix pour le développement moderne. Cependant, même le meilleur code peut contenir des erreurs.

Pour les développeurs Golang, le journal des erreurs est un outil très important. Ils vous permettent d'identifier rapidement les erreurs et de les corriger, rendant votre application plus robuste et fiable. Cependant, pour utiliser correctement les journaux d’erreurs, vous devez savoir comment les créer, les enregistrer et les déboguer.

Cet article présentera les mécanismes courants de journalisation des erreurs dans Golang, y compris la gestion des erreurs de base, le mécanisme de panique/différence, le journal de bibliothèque standard et la bibliothèque de journaux tierce, ainsi que certaines bonnes pratiques et compétences de débogage.

  1. Gestion de base des erreurs
    Le mécanisme de base de gestion des erreurs dans Golang consiste à utiliser le type d'erreur. Il s'agit d'une interface prédéfinie utilisée pour représenter les informations d'erreur renvoyées par certaines fonctions ou méthodes. Si la valeur de retour d'une fonction ou d'une méthode contient une valeur de type error, cela signifie que l'opération a peut-être échoué. Vous pouvez utiliser des instructions if ou des instructions switch pour vérifier la valeur de l'erreur et prendre les mesures appropriées. Par exemple :

func openFile(filename string) error {

file, err := os.Open(filename)
if err != nil {
    return err
}
defer file.Close()

return nil
Copier après la connexion

}

Dans le code ci-dessus, la fonction openFile ouvre un fichier et renvoie une valeur de type error. Si le fichier ne peut pas être ouvert, il renverra une valeur d'erreur non nulle. Dans le programme principal, vous pouvez vérifier la valeur d'erreur renvoyée et agir en conséquence :

err := openFile("input.txt")
if err != nil {

log.Fatal(err)
Copier après la connexion
Copier après la connexion

}

Dans ce cas, la fonction main appelle le fonction openFile et vérifie l’erreur renvoyée. Si une erreur se produit, il imprime un message d'erreur et quitte le programme.

  1. Mécanisme de panique/defer
    Il existe un mécanisme spécial dans Golang qui peut être utilisé lorsqu'une erreur fatale se produit dans le programme : le mécanisme de panique/defer. Lorsqu'un programme rencontre une erreur qui ne peut pas être gérée, il peut appeler la fonction de panique pour déclencher une exception de panique, ce qui interrompra l'exécution de la fonction en cours et remontera dans la pile d'appels jusqu'à ce qu'elle soit correctement interceptée ou que le programme se termine. Normalement, vous ne devez pas appeler directement la fonction panique. Au lieu de cela, vous devez utiliser le mécanisme de report pour intercepter les exceptions et effectuer certaines opérations de nettoyage, telles que la fermeture de fichiers, la libération de mémoire, etc. Par exemple :

func openFile(filename string) {

file, err := os.Open(filename)
if err != nil {
    panic(err)
}
defer file.Close()

// ... code that uses the file ...
Copier après la connexion

}

Dans l'extrait de code ci-dessus, la fonction openFile tente d'ouvrir un fichier. Si l'ouverture échoue, une exception de panique sera déclenchée. Il utilise ensuite une instruction defer pour garantir la fermeture du fichier. Dans la fonction main correspondante, vous pouvez écrire une instruction recovery pour intercepter l'exception et effectuer des opérations de nettoyage :

func main() {

defer func() {
    if r := recover(); r != nil {
        log.Println("Recovered from panic:", r)
    }
}()

openFile("input.txt")
Copier après la connexion

}

Dans ce cas, la fonction main utilise une instruction defer pour garantir que dans n'importe quel cas cas L'erreur sera détectée ci-dessous. Si la fonction openFile déclenche une exception, l'instruction de récupération sera exécutée et un message d'erreur sera imprimé.

  1. Journal de la bibliothèque standard
    La bibliothèque standard de Golang contient un système de journalisation très basique : le package log. Il dispose de trois fonctions de sortie : Print, Printf et Println. Ils fonctionnent de la même manière, ils formatent simplement la chaîne différemment. Par exemple :

log.Print("Hello, world!")
log.Printf("Bonjour, %s!", "world")
log.Println("Hello", "world")

Ces fonctions Afficher le texte sur la sortie standard. Si vous devez écrire le fichier journal dans un fichier au lieu de la console, utilisez log.SetOutput :

f, err := os.Create("logfile")
if err != nil {

log.Fatal(err)
Copier après la connexion
Copier après la connexion

}
defer f . Close()
log.SetOutput(f)

Cela créera un fichier appelé fichier journal et écrira toutes les sorties du journal dans ce fichier.

Le package de journaux Golang fournit également d'autres fonctionnalités, telles que la création d'enregistreurs personnalisés et la définition de niveaux de journalisation, etc. Consultez la documentation officielle pour plus de détails.

  1. Bibliothèques de journalisation tierces
    Il existe de nombreuses excellentes bibliothèques de journalisation tierces dans la communauté Golang, telles que logrus, zap, zerolog, etc. Ces bibliothèques offrent plus de fonctionnalités et d'options telles que la journalisation structurée, plusieurs sorties, des niveaux de journalisation et des contrôles de champ personnalisables, et bien plus encore. Voici un exemple de code utilisant la bibliothèque logrus :

import log "github.com/sirupsen/logrus"

func main() {

log.SetFormatter(&log.JSONFormatter{})
log.SetLevel(log.WarnLevel)

log.WithFields(log.Fields{
    "animal": "walrus",
    "size":   10,
}).Info("A group of walrus emerges from the ocean")
Copier après la connexion

}

Dans cet exemple, nous utilisons la bibliothèque logrus et le changement de format JSON . Ensuite, nous avons défini le niveau d'erreur sur avertissement, puis nous avons utilisé l'entrée de journal de logrus, nous avons fourni certains champs et nous avons enregistré le message indiquant qu'un groupe de morses avait émergé de l'océan.

  1. Conseils de débogage
    Lors de l'écriture de code, rechercher et corriger les erreurs prend toujours du temps. Voici quelques conseils de débogage utiles qui peuvent vous aider à résoudre les problèmes plus rapidement.
  2. Utilisez fmt.Printf pour imprimer les valeurs intermédiaires.

Lorsque vous constatez que le résultat de votre code n'est pas celui que vous attendez, vous pouvez utiliser fmt.Printf pour essayer d'identifier le problème. Par exemple :

func foo() {

for i := 0; i < 10; i++ {
    fmt.Printf("%d\n", i)
}
Copier après la connexion

}

Dans ce cas, la fonction foo affichera le nombre sélectionné à chaque itération de la boucle, nous aidant ainsi à identifier le problème.

  1. 使用log.Println或log.Printf记录哪一步失败了。

在某些情况下,您的代码可能会因多个原因之一而失败。使用log.Println或log.Printf来记录当前执行的代码行可以帮助您定位错误。例如:

func openFile(filename string) error {

log.Printf("Trying to open file %s", filename)
file, err := os.Open(filename)
if err != nil {
    log.Printf("Failed to open file %s: %s", filename, err)
    return err
}
defer file.Close()

return nil
Copier après la connexion

}

在这种情况下,函数openFile在尝试打开文件之前记录了它正在尝试打开的文件名。如果出现错误,它还将记录哪个文件无法正常打开。

  1. 使用GDB进行调试。

如果您需要深入调试代码,GDB可能是您需要的工具。它是一个强大的调试器,可以与Golang程序一起使用。例如:

$ go build -gcflags "-N -l" -o myprogram
$ gdb ./myprogram

使用上面的命令编译您的Golang程序和调试器。您还需要添加-gcflags“-N -l”标志以确保GDB可以正确识别调试信息。然后,您可以在GDB命令行中运行程序并在其中设置断点和查看变量等。

总结
对于Golang开发者来说,错误日志是一个非常重要的工具,可以帮助识别和解决问题。本文介绍了Golang中常见的错误日志机制,包括基本的错误处理、panic/defer机制、标准库log和第三方日志库,以及一些最佳实践和调试技巧。无论您是新手还是高级开发人员,正确地使用错误日志机制都是必不可少的。

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 de ce site Web
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

GO Language Pack Import: Quelle est la différence entre le soulignement et sans soulignement? GO Language Pack Import: Quelle est la différence entre le soulignement et sans soulignement? Mar 03, 2025 pm 05:17 PM

Cet article explique les mécanismes d'importation des packages de Go: les importations nommées (par exemple, importation & quot; fmt & quot;) et les importations vierges (par exemple, importation _ & quot; fmt & quot;). Les importations nommées rendent le contenu du package accessible, tandis que les importations vierges ne font que l'exécuter t

Comment convertir la liste des résultats de la requête MySQL en une tranche de structure personnalisée dans le langage Go? Comment convertir la liste des résultats de la requête MySQL en une tranche de structure personnalisée dans le langage Go? Mar 03, 2025 pm 05:18 PM

Cet article détaille la conversion efficace de la requête MySQL Resulte en tranches de structure GO. Il met l'accent sur l'utilisation de la méthode de numérisation de la base de données / SQL pour des performances optimales, en évitant l'analyse manuelle. Meilleures pratiques pour la cartographie des champs struct à l'aide de balises DB et de robus

Comment mettre en œuvre le transfert d'informations à court terme entre les pages du cadre Beego? Comment mettre en œuvre le transfert d'informations à court terme entre les pages du cadre Beego? Mar 03, 2025 pm 05:22 PM

Cet article explique la fonction Newflash () de Beego pour le transfert de données inter-pages dans les applications Web. Il se concentre sur l'utilisation de NewFlash () pour afficher les messages temporaires (succès, erreur, avertissement) entre les contrôleurs, en tirant parti du mécanisme de session. Limiter

Comment écrire des objets et des talons simulés pour les tests en Go? Comment écrire des objets et des talons simulés pour les tests en Go? Mar 10, 2025 pm 05:38 PM

Cet article montre la création de simulations et de talons dans GO pour les tests unitaires. Il met l'accent sur l'utilisation des interfaces, fournit des exemples d'implémentations simulées et discute des meilleures pratiques telles que la tenue de simulations concentrées et l'utilisation de bibliothèques d'assertion. L'articl

Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go? Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go? Mar 10, 2025 pm 03:20 PM

Cet article explore les contraintes de type personnalisé de Go pour les génériques. Il détaille comment les interfaces définissent les exigences de type minimum pour les fonctions génériques, améliorant la sécurité du type et la réutilisabilité du code. L'article discute également des limitations et des meilleures pratiques

Comment écrire des fichiers dans GO Language de manière pratique? Comment écrire des fichiers dans GO Language de manière pratique? Mar 03, 2025 pm 05:15 PM

Cet article détaille la rédaction de fichiers efficace dans GO, en comparant OS.WriteFile (adapté aux petits fichiers) avec OS.OpenFile et Buffered Writes (optimal pour les fichiers volumineux). Il met l'accent sur la gestion robuste des erreurs, l'utilisation de différer et la vérification des erreurs spécifiques.

Comment rédigez-vous des tests unitaires en Go? Comment rédigez-vous des tests unitaires en Go? Mar 21, 2025 pm 06:34 PM

L'article traite des tests d'unité d'écriture dans GO, couvrant les meilleures pratiques, des techniques de moquerie et des outils pour une gestion efficace des tests.

Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO? Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO? Mar 10, 2025 pm 05:36 PM

Cet article explore l'utilisation d'outils de traçage pour analyser le flux d'exécution des applications GO. Il traite des techniques d'instrumentation manuelles et automatiques, de comparaison d'outils comme Jaeger, Zipkin et OpenTelelemetry, et mettant en évidence une visualisation efficace des données

See all articles