Essayer de comprendre VRAIMENT ce qui s'est mal passé quand un " ImportError` est soulevée

Prendre Django par exemple, dans manage.py:

try:
    import settings
except ImportError:
    sys.stderr.write("Error: Can't find the file 'settings.py'...")

Semble légitime, mais ce qui arrive quand settings importations non_existant_lib_foo?

Eh bien, vous êtes envoyé sur une poursuite de l'oie pour toutes les choses que tu aurais pu faire avec PATH, etc.

Bien sûr, vous pouvez utiliser except ImportError as e: et il suffit d'imprimer le message d'erreur réelle, mais que faire si vous voulez attraper qu'une seule erreur et donner un très bon conseil, comme ci-dessus?

Vous êtes de gauche à l'aide de regexp plus ou moins ou, au mieux, devinant que le "droit" module échec de l'importation, puis d'afficher le message.

Est-il une meilleure façon de gérer cela?

"mais que faire si vous voulez attraper qu'une seule erreur et donner un très bon conseil, comme ci-dessus" "Le code ci-dessus affiche un message utile, à droite? De mal", je ne peux pas suivre. Généralement, nous venons de corriger les erreurs d'importation, sans faire la try/except traitement à tous.
Parfois, vous voulez noter qu'un module optionnel n'a pas été trouvé, mais de fournir à un utilisateur signe visible que ce qui s'est passé dans le cas où il est dû à une erreur de configuration plutôt que d'être intentionnelle.
Pourquoi est-ce mieux que le traceback? L'erreur est le problème. Pourquoi l'envelopper? Comment fait-il m'aider? La question est simplement que "l'habillage" l'erreur est trompeuse. Alors pourquoi envelopper l'erreur si le enveloppés d'erreur est trompeur?
Je vais reporter: pensez-vous que les développeurs Django juste faire des choses comme ça à être con? Il y a un besoin évident.
Remarque le facultatif mise en garde. La seule fois où cela a du sens pour supprimer un échec de l'import d'un module, c'est quand il n'est pas une erreur fatale. Python se fait dans site.py lors de la vérification pour un sitecustomize module: si l'importation échoue pour une raison quelconque, Python l'ignore complètement. L'émission d'un avertissement quand un "généralement utilisé, mais n'est pas obligatoire" couture module ne parvient pas à importer correctement est raisonnable de milieu de terrain.

OriginalL'auteur orokusaki | 2011-02-24