Gestion des exceptions dans la langue Google Go

Je me demande... J'ai lu à propos de Go il y a quelque temps et j'ai essayé de programmer quelque chose dedans. Je semble tout à fait intéressant. Mais j'ai atteint gérer les "exceptions" dans cette langue . J'ai lu sur leur approche et cela semble raisonnable. Je voudrais savoir quels sont les avantages de l'approche exceptionnelle standard par rapport au style du Go? Quels sont les avantages et les inconvénients?

Edit pour être droit: Je ne veux pas faire de guerre sainte sur les exceptions. Je me demande juste si ce style de gestion des erreurs a des avantages? Quels sont les avantages réels de ce style par rapport aux exceptions standard? Cela vaut-il la peine de se demander du tout?

29
demandé sur Archie 2011-08-26 02:39:54

1 réponses

Panic / recover est l'équivalent moral des exceptions try/catch. Il y a une différence superficielle (syntaxe) et une différence subtile, mais importante, de l'utilisation prévue.

Les meilleures explications des problèmes avec les exceptions en général sont "plus propre, plus élégant, faux" et c'est un bon aperçu des avantages/inconvénients des exceptions par rapport aux codes d'erreur de retour.

Les concepteurs de Go ont décidé que la gestion des erreurs en renvoyant les codes d'erreur des fonctions est la voie idiomatique Go et la langue prend en charge plusieurs valeurs de retour pour le rendre syntaxiquement facile. Alors que panic / recover est fourni, la différence n'est pas de fonctionnalité mais d'utilisation prévue.

D'autres langues exposant des exceptions favorisent leur utilisation et en pratique, elles sont fréquemment utilisées (parfois même mal utilisées).

Aller décourage l'utilisation de panique/récupérer. Vous pouvez le faire, mais vous n'êtes censé le faire que dans des scénarios très limités.

Si vous regardez la propre bibliothèque standard de Go, la plupart des utilisations de panic sont pour signaler des erreurs fatales, indiquant soit une erreur interne (c'est-à-dire un bug) dans le code de la bibliothèque ou appelant la bibliothèque avec des données erronées (par exemple, passer des données non-json aux fonctions de décodage json).

Mais comme le souligne l'article auquel vous avez lié: "la convention dans les bibliothèques Go est que même lorsqu'un paquet utilise panic en interne, son API externe présente toujours des valeurs de retour d'erreur explicites."

Ceci est différent des langages comme C#, Java, Python ou C++, où beaucoup de standard le code de la bibliothèque peut lancer des exceptions aux erreurs de signal. Ces langues veulent que vous utilisiez des exceptions. Aller décourage l'utilisation de panique/récupérer.

Pour résumer:

  • le style idiomatique Go consiste à utiliser des codes d'erreur pour informer l'appelant des erreurs
  • utilisez panic / recover uniquement dans de rares cas:
    • pour "planter" votre programme lorsqu'il rencontre une incohérence interne indiquant des bogues dans votre code. C'est essentiellement une aide au débogage.
    • si cela simplifie considérablement l'erreur gestion de votre code (mais si le code doit être utilisé par d'autres, n'exposez jamais de telles paniques aux appelants)

En pratique, l'important est d'utiliser le style idiomatique du langage. Dans Go qui renvoie des codes d'erreur et évite la panique / récupérer. En C#, cela utilise des exceptions pour signaler certaines des erreurs.

51
répondu Krzysztof Kowalczyk 2012-12-10 01:14:09