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
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
Vous devez vous connecter pour publier un commentaire.
Fondamentalement, le problème est que ton message d'erreur est incorrect, il y a d'autres raisons pour lesquelles l'importation peut échouer, et pas seulement de mauvais chemins.
ImportError
signifie tout simplement "vous ne pouvez pas utiliser ce module, regardez le traceback de savoir pourquoi, vous avez juste sauté à une conclusion.Si vous souhaitez afficher "impossible de trouver le fichier" alors vous devriez regarder d'abord le fichier.
imp.find_module
fait.OriginalL'auteur Jochen Ritzel
La façon la plus simple pour gérer les cas où vous ne voulez pas laisser à l'exception de se propager, mais encore donner une indication de l'échec, est d'inclure les détails de l'original de l'exception dans le message que vous imprimez:
De cette façon, vous obtenez le message clair dans le cas le plus courant (par exemple à l'utilisateur de mettre leur fichier de settings dans le mauvais endroit, ou il y a une erreur de configuration quelque part afin
sys.path
est mal), sans complètement occulter toutes les autres erreurs d'importation qui surviennent pendant l'exécution de lasettings
module.Encore mieux, si vous utilisez le module de journalisation, est pour vous l'intégralité des détails de l'exception (y compris le traceback) comme un
debug()
ouinfo()
événement de journalisation.Il y a d'autres options, telles que la réalisation d'une sous-chaîne de recherche
if 'settings' not in str(exc): raise
ou pour la séparation de l'emplacement du module de son exécution à l'aide deimp.find_module()
, mais simplement d'inclure le message d'erreur d'origine est suffisant pour empêcher le pire des tracas.OriginalL'auteur ncoghlan
Prendre le conseil.
Ne pas piège erreurs d'importation jamais. Le
manage.py
exemple n'est pas une bonne pratique.Ne pas le faire.
erreurs d'importation doit être très, très rare.
SafeConfigParser
etConfigParser
.Lott - je n'ai pas l'intention de "piéger" les erreurs en permanence. C'est agréable pendant le flux de contrôle pour savoir si un problème vient bien de sorte que vous pouvez faire des choses précises, même si vous avez l'intention de ré-augmenter.
nice pendant le flux de contrôle pour savoir si un problème vient de" Qu'est ce que l'ordinaire, non modifiée, non interceptée à l'importation d'exception vous dit -- il vous dit précisément d'où vient l'erreur. Pourquoi modifier le parfait message d'erreur déjà fourni?
Je ne parle pas de moi en tant que développeur de "savoir", je veux dire dans le contrôle je veux mon code pour être en mesure de "savoir" ce que l'échec de l'importation. Encore une fois, de reporter à Django. Que utiles message n'a pas pu être remis, si vous vous êtes basé sur Python intégré dans l'exc de la manipulation.
De nouveau. Ne pas reporter à ce seul exemple extrait de Django. Ce n'est pas la meilleure pratique. Le Code n'a pas besoin de savoir quand un échec de l'importation. Il ne devrait pas échouer.
OriginalL'auteur S.Lott