2010-11-15 6 views
9

J'ai quelques questions sur les exceptions définies par l'utilisateur dans Python et comment elles devraient être organisées dans un projet complet.Python: Organisation d'exceptions définies par l'utilisateur dans un projet complet

J'ai un projet python assez complexe avec des sous-paquets qui a la structure (__init__.py omis) suivante:

/docs (Documentation) 
/apidocs (generated API documentation) 
/askindex (my application package) 
    /test (Unit tests directory) 
     test_utils.py 
     ... (more tests) 
    /workers (various worker classes) 
     communicators.py 
     processes.py 
     threads.py 
     utils.py 
    main.py (contains the starting point) 
    data_objects.py (various objects used all around the application) 
    settings.py (settings of the application) 
README.txt 

Je voudrais mettre en œuvre ma propre exception de les utiliser dans les modules du ' paquet de travailleurs pour des erreurs spécifiques.

Où dois-je placer ces exceptions? Je sais que je devrais avoir ma propre exception de base qui sous-classe la classe Exception standard et la sous-classe pour mes autres exceptions. Devrais-je créer un nouveau module 'exceptions' sous 'workers'? Mettre des classes d'exception dans le module dans lequel elles sont levées? Dans ce cas, où devrais-je mettre ma classe de base? Est-ce que ma structure de demande est appropriée?

Je suis nouveau à des exceptions en Python, donc s'il vous plaît excusez-moi si la réponse est évidente ...

Répondre

5

En général, je l'ai trouvé avec mon propre travail que quand je veux un type personnalisé d'exception, il est spécifique à un module ou un paquet particulier. Si c'est pertinent pour un module, je le mets juste dans ce module. Je n'ai pas encore trouvé un cas où il serait plus facile d'avoir un module ou un paquet dédié aux exceptions.

Exemples: si j'ai un module jester, avec une classe en Juggler avec une méthode juggle qui peut soulever une DroppedBall (cue lancer des tomates pourries ou similaires), le DroppedBall serait dans le module jester. Ensuite, les instances crowd.Person pouvaient try regarder le jongleur et except jester.DroppedBall.

Si j'avais un paquet food, avec différents modules en elle, fruit, vegetable, etc., qui ont tous une méthode eat (héritée de food.Foodstuff, sans doute), ils pourraient être en mesure de soulever un RottenException, qui appartiendrait naturellement à la racine du package food: __init__.py.

+0

Merci pour votre réponse rapide. Je n'avais pas pensé au module __init__.py. Je n'ai jamais vraiment su quoi mettre dedans sauf le paquet docstring et meta. Suivant votre exemple, l'exception serait-elle référencée comme food.RottenException? –

+1

@Marc: oui. Un modèle commun pour les grands modules est de les diviser en modules séparés et d'avoir le paquet '__init __ .py' contenant les importations relatives pour relier les modules ensemble (souvent 'de xyz import *', avec xyz définissant '__all__'). Dans ce cas, c'est probablement pas applicable, vraiment. Vous pourriez vouloir importer des communicateurs, des processus, des threads, des utils, par exemple, tout comme 'os' importe' path' de sorte que 'import os' implique' import os.path'. –

+0

@Marc: Suivant cet exemple 'food', un peu plus loin, la classe' Foodstuff' serait définie dans '__init __. Py', et' food.fruit' serait 'importé de la nourriture' et aurait alors' la classe Tomate (food.Foodstuff) '. Tant que vous êtes prudent et n'utilisez pas 'from food import Foodstuff', la référence circulaire est OK (voir [cet article sur effbot] (http://effbot.org/zone/import-confusion.htm#circular -importations)). –

Questions connexes