De nombreuses exigences sont nécessaires pour qu'un système transmette et gère correctement les exceptions. Il existe également de nombreuses options pour une langue à choisir pour implémenter le concept.
Conditions d'exceptions (sans ordre particulier):
Documentation : un langage doit avoir un moyen de documenter les exceptions qu'une API peut lancer. Idéalement, ce support de documentation devrait être utilisable par la machine pour permettre aux compilateurs et aux IDE de fournir une assistance au programmeur.
Transmettre des situations exceptionnelles : celle-ci est évidente, pour permettre à une fonction de transmettre des situations qui empêchent la fonctionnalité appelée d'exécuter l'action attendue. À mon avis, il existe trois grandes catégories de telles situations:
2.1 Bogues dans le code qui rendent certaines données invalides.
2.2 Problèmes de configuration ou d'autres ressources externes.
2.3 Ressources intrinsèquement peu fiables (réseau, systèmes de fichiers, bases de données, utilisateurs finaux, etc.). Ce sont un peu un cas de coin, car leur nature peu fiable devrait nous faire attendre leurs échecs sporadiques. Dans ce cas, ces situations doivent-elles être considérées comme exceptionnelles?
Fournissez suffisamment d'informations pour que le code le gère : les exceptions doivent fournir suffisamment d'informations à l'appelé pour qu'il puisse réagir et éventuellement gérer la situation. les informations doivent également être suffisantes pour que, lorsqu'elles sont consignées, ces exceptions fournissent suffisamment de contexte à un programmeur pour identifier et isoler les déclarations incriminées et fournir une solution.
Donner confiance au programmeur quant à l'état actuel de l'état d'exécution de son code : les capacités de gestion des exceptions d'un système logiciel doivent être suffisamment présentes pour fournir les garanties nécessaires tout en restant à l'écart du programmeur afin qu'il puisse rester concentré sur la tâche à main.
Pour les couvrir, les méthodes suivantes ont été mises en œuvre dans différentes langues:
Exceptions vérifiées Fournir un excellent moyen de documenter les exceptions, et théoriquement, lorsqu'elles sont implémentées correctement, elles devraient rassurer amplement que tout va bien. Cependant, le coût est tel que beaucoup pensent qu'il est plus productif de simplement contourner soit en avalant des exceptions, soit en les renvoyant en tant qu'exceptions non contrôlées. Lorsqu'elles sont utilisées de manière inappropriée, les exceptions perdent à peu près tout son utilité. De plus, les exceptions vérifiées rendent difficile la création d'une API stable dans le temps. Les implémentations d'un système générique dans un domaine spécifique entraîneront une charge de situation exceptionnelle qui deviendrait difficile à maintenir en utilisant uniquement des exceptions vérifiées.
Exceptions non vérifiées - beaucoup plus polyvalentes que les exceptions vérifiées, elles ne documentent pas correctement les situations exceptionnelles possibles d'une implémentation donnée. Ils s'appuient sur une documentation ad hoc le cas échéant. Cela crée des situations où la nature peu fiable d'un support est masquée par une API qui donne l'apparence de la fiabilité. De plus, lorsqu'elles sont levées, ces exceptions perdent leur sens lorsqu'elles remontent à travers les couches d'abstraction. Étant donné qu'ils sont mal documentés, un programmeur ne peut pas les cibler spécifiquement et doit souvent lancer un réseau beaucoup plus large que nécessaire pour garantir que les systèmes secondaires, en cas de défaillance, n'effondrent pas tout le système. Ce qui nous ramène au problème de déglutition des exceptions vérifiées fournies.
Types de retour multi-états Ici, il s'agit de s'appuyer sur un ensemble disjoint, un tuple ou un autre concept similaire pour renvoyer le résultat attendu ou un objet représentant l'exception. Ici pas de déroulement de pile, pas de coupure du code, tout s'exécute normalement mais la valeur de retour doit être validée pour erreur avant de continuer. Je n'ai pas encore vraiment travaillé avec cela, donc je ne peux pas commenter par l'expérience.Je reconnais que cela résout certains problèmes, les exceptions contournant le flux normal, mais il souffrira à peu près des mêmes problèmes que les exceptions vérifiées, car il est fatigant et constamment "en face".
La question est donc:
Quelle est votre expérience en la matière et quel est, selon vous, le meilleur candidat pour faire un bon système de gestion des exceptions pour une langue?
EDIT: Quelques minutes après avoir écrit cette question, je suis tombé sur ce post , effrayant!
noexcept
histoire en C ++ peut également fournir de très bonnes informations pour EH en C # et Java.)