/ / Est-ce qu'utiliser une exception pour aller à une approche pythonique? - python

Est-ce que l'utilisation d'une exception en tant que goto est une approche pythonique? - python

J'ai un ensemble complexe de conditions, dont j'aimerais sortir une fois remplies.

Pour cela je voudrais utiliser un try: / except: structure autour d’eux pour sortir au bon moment, ce qui est semblable à un goto. Un exemple compliqué (utilisant un raise à break de while) serait:

class Minor(Exception):
pass
class Major(Exception):
pass

age = 15
while True:
try:
if age > 18:
raise Major
else:
raise Minor
except Major:
print("major")
break
except Minor:
print("minor")
break

Une telle utilisation des exceptions est-elle pythonique? En d'autres termes: les exceptions étaient-elles destinées uniquement à capturer ce qui aurait été un traçage, ou ont-elles un usage général, comme ci-dessus?

EDIT: après les commentaires, je voudrais préciser que je ne cherche pas à simplifier ce code spécifique - le code réel est beaucoup plus complexe avec des boucles et des conditions imbriquées. La partie qui m'intéressait était de savoir s'il y avait des raisons de décourager spécifiquement l'utilisation d'exceptions.

Réponses:

4 pour la réponse № 1

Non, ce n'est pas une approche pythonique. La méthode habituelle de contrôle de flux utilisée pour sortir immédiatement des boucles imbriquées consiste à placer la logique dans une fonction et à utiliser return déclaration.

PEP 3136 a déjà été proposé comme moyen d’échapper aux boucles imbriquées à l’aide des instructions étiquetées break and continue:

Le marquage et continuer continus peuvent améliorer la lisibilité et la flexibilité d'un code complexe qui utilise des boucles imbriquées.

Ce PEP a été rejeté pour Python 3.1. Guido a écrit:

Je le rejette sur la base de ce code si compliqué à exiger cette fonctionnalité est très rare. Dans la plupart des cas, il existe des solutions de contournement qui produisent un code propre, par exemple en utilisant "return".