Occasionnellement dans mon code, j'utiliserai intentionnellement une exception lancée comme déclencheur d'événement. Par exemple, je bouclerai jusqu'à ce qu'une exception soit levée, puis break;
dans la clause catch
. Est-ce une mauvaise pratique? Serait-il plus efficace (ou plus propre) d'interroger un attribut de ce que je suis en boucle pour prédéterminer les indices (c'est-à-dire prédéterminer quand arrêter la boucle)? Bien sûr, je ne fais cela que lorsque je suis sûr qu'une exception sera effectivement lancée pour éviter une boucle infinie. Merci!Utiliser les exceptions gérées comme déclencheur prévu?
Répondre
Oui, c'est une mauvaise pratique. Les exceptions devraient être utilisées pour des choses exceptionnelles - par ex. conditions qui sont de vraies erreurs qui ne devraient pas survenir dans le cours normal des opérations.
Une raison importante est que les exceptions coûtent cher en termes de temps CPU.
Il sera beaucoup plus efficace, et probablement beaucoup plus facile de déboguer et de vérifier si vous utilisez un drapeau ou un autre signal pour terminer votre boucle.
Il est recommandé de lancer une exception dans le cadre d'un flux de contrôle de programme normal. Des exceptions doivent être réservées aux événements exceptionnels tels que la gestion des erreurs.
Ce n'est pas aussi génial de faire une boucle continuellement en attendant qu'un événement se produise. Consultez le Observer design pattern pour la droite façon de coder ce type de chose.
Ce n'est pas vraiment un problème de langue-agnostique!
Certaines langues, comme Python, raisonnablement exceptions légers, et ils font l'utilisation d'exceptions pour le contrôle du flux d'une approche assez unobjectionable - par exemple, chaque déclaration for
en Python (à moins mis fin prématurément par un break
) est toujours terminé lorsqu'une exception se produit (une exception StopIteration
de l'itérateur utilisé dans le for
). Tout utilisateur de Python ne peut donc pas s'opposer à une boucle systématiquement terminée par des exceptions ... à moins qu'ils n'utilisent jamais, jamais, des boucles for
(assez improbable ;-).
D'autres langues considèrent les exceptions comme un événement vraiment exceptionnel, et dans les langues vous ne devez pas les utiliser pour des tâches de contrôle de flux ordinaires; Apparemment, toutes les réponses données à votre question prennent cela pour acquis d'une manière "agnostique", ignorant l'existence ou la nature réelle ou les langages tels que Python. Ceux d'entre nous qui connaissent les deux types de langages apprennent assez bien à "nager avec le flux": je n'aurais aucun problème à utiliser des exceptions pour le contrôle de flux en Python, mais j'éviterais certainement de le faire en C++, pour Exemple!
- 1. Global.asax et exceptions non gérées
- 2. Exceptions non gérées avec Global.asax
- 3. Consignation automatique des exceptions non gérées sans utiliser try/catch
- 4. Le déclencheur contextuel ne fonctionne pas comme prévu
- 5. Gestion du problème des exceptions non gérées
- 6. Quelque chose engloutit des exceptions non gérées?
- 7. Comment voir les détails des exceptions gérées dans WinDBG?
- 8. Exceptions non gérées Crashing VS 2008
- 9. Capturez toutes les exceptions non gérées automatiquement avec WebService
- 10. N'importe lesquels ont un raccourci/macro Visual Studio pour basculer entre les exceptions gérées/non gérées?
- 11. Les messages du journal des événements sont développés lorsque des exceptions non gérées sont gérées par ASP.NET
- 12. Enregistrement des exceptions non gérées pour Windows Forms
- 13. Événement pour les exceptions non gérées dans les threads d'arrière-plan Silverlight?
- 14. ne fonctionne pas comme prévu
- 15. JFrame n'agit pas comme prévu!
- 16. $ _POST données non comme prévu
- 17. Comment utiliser les exportations non gérées dans Delphi
- 18. Options non gérées à gérées: considérations sur les performances
- 19. Comment comparer les chaînes gérées et non gérées?
- 20. setAnimationRepeatAutoreverses ne s'est pas comporté comme prévu
- 21. Bonne bibliothèque de journalisation pour les applications gérées/non gérées?
- 22. Forcer l'option d'erreur de fermeture de rapport: utilisation dans les exceptions gérées?
- 23. Est-ce que Javascript déclenche un événement pour les exceptions non gérées/non interceptées?
- 24. collection_select ne fonctionne pas comme prévu
- 25. MySql ne renvoie pas les résultats comme prévu
- 26. LinqToXml ne gère pas les éléments Nillable comme prévu
- 27. Les opérateurs de comparaison ne fonctionnent pas comme prévu
- 28. boucle php ne fonctionne pas comme prévu
- 29. le filtre ne fonctionne pas comme prévu
- 30. addEventListener & wmp ne fonctionne pas comme prévu
Est-ce que le downvoter se souciait de commenter? – Asaph