2009-11-04 5 views
2

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

0

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.

0

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.

+0

Est-ce que le downvoter se souciait de commenter? – Asaph

2

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!

Questions connexes