Localisation du numéro de ligne, lorsqu'une exception se produit dans le code python
J'ai un code similaire à ceci:
try:
if x:
statement1
statement2
statement3
elif y:
statement4
statement5
statement6
else:
raise
except:
statement7
Ici, je suis sûr que l'exception se produit dans If x:
bloc, mais je voudrais savoir dans quel état de If x:
bloc de l'exception se produit. Est-il possible d'obtenir le numéro de la ligne où l'erreur se produit?
Ce qui concerne,
Vous ne mentionnez pas pourquoi vous voulez cette. Pour déboguer un problème? De sorte que statement7 peut faire quelque chose de différent selon l'endroit où l'exception a été soulevée? Pouvez-vous nous en dire plus?
Dans mon code l'exception ne devrait pas se produire dans l'état 1 ou de la déclaration 2. si c'est le cas, soit de ci statement1 ou 2 est défectueux. il est acceptable d'avoir dans statement3. C'est pourquoi je voudrais savoir dans quelle ligne il y a exception à la règle.
Mais qu'allez-vous faire avec ces informations? Avez-vous besoin d'une fois pour corriger le programme, ou en avez-vous besoin au moment de l'exécution?
J'en ai besoin une fois de corriger les défauts des lignes. Maintenant, j'ai trouvé le fautif ligne, merci à tous!
Dans mon code l'exception ne devrait pas se produire dans l'état 1 ou de la déclaration 2. si c'est le cas, soit de ci statement1 ou 2 est défectueux. il est acceptable d'avoir dans statement3. C'est pourquoi je voudrais savoir dans quelle ligne il y a exception à la règle.
Mais qu'allez-vous faire avec ces informations? Avez-vous besoin d'une fois pour corriger le programme, ou en avez-vous besoin au moment de l'exécution?
J'en ai besoin une fois de corriger les défauts des lignes. Maintenant, j'ai trouvé le fautif ligne, merci à tous!
OriginalL'auteur alwbtc | 2011-08-05
Vous devez vous connecter pour publier un commentaire.
quoi à ce sujet:
c'est la simplicité de la solution de contournement, mais je suggère d'utiliser un débogueur
ou mieux encore, utiliser le module sys 😀
OriginalL'auteur Ant
Je crois que les plusieurs réponses ici vous recommander de gérer votre
try/except
blocs plus étroitement la réponse que vous cherchez. C'est un style de chose, pas une bibliothèque chose.Cependant, parfois, nous nous trouvons dans une situation où il n'est pas un style de chose, et vous avez vraiment ne besoin du numéro de ligne à faire d'autres programattic action. Si c'est ce que vous demandez, vous devriez envisager la
traceback
module. Vous pouvez extraire toutes les informations dont vous avez besoin sur les plus récentes exception. Letb_lineno
fonction retourne le numéro de la ligne provoquant l'exception.Des versions plus récentes de la traçabilité en amont de la plomberie résoudre le problème avant la 2.3, permettant le code ci-dessous fonctionne comme il a été prévu: (c'est le "droit chemin")
tb_lineno est une fonction, pas un attribut. Il prend le traceback en tant que paramètre. J'ai édité le post pour être plus clair. essayez "impression de retraçage.tb_lineno(sys.exc_info()[2])" -- assurez-vous d'ajouter la parenthèse.
OriginalL'auteur J.J.
Vous devez exécuter votre programme dans un débogueur, comme
apb
. Cela vous permettra de exécuter votre code normalement, et ensuite examiner l'environnement lorsque quelque chose d'inattendu, comme cela se produit.Donné un script nommé "main.py', exécutez-le comme ceci:
Puis, quand le programme démarre, il va démarrer le débogueur. Type
c
continuer jusqu'au prochain point d'arrêt (ou blocage). Ensuite, vous pouvez examiner l'environnement en faisant des choses commeprint spam.eggs
. Vous pouvez également définir des points d'arrêt en faisantpdb.set_trace()
(I couramment neimport pdb; pdb.set_trace()
).En outre, que voulez-vous dire qu'il est "bon" pour la déclaration de la 3' de lever l'exception? Attendez-vous de l'exception? Si oui, il pourrait être préférable d'écrire un try/except bloc autour de cette déclaration, de sorte que le programme puisse continuer.
python -m pdb manage.py syncdb --settings=settings_development
oupython -m pdb manage.py runserver --settings=settings_development
.OriginalL'auteur Darthfett
J'ai effectué les opérations suivantes avant de:
L'avantage sur l'impression des points de contrôle est il n'y a pas de sortie du journal, à moins que
il y a en fait une exception.
OriginalL'auteur Rufus
Bâtiment sur JJ ci-dessus..
L'avantage de l'utilisation du système d'erreurs sur des déclarations est qu'ils enregistrent des informations plus spécifiques qui aideront le débogage plus tard (croyez-moi j'en ai beaucoup)
par exemple. Je les enregistrer dans un fichier texte, donc après mes programmes ont automatiquement de fonctionner pendant la nuit sur le serveur, je peux récupérer toutes les questions, et d'avoir assez d'informations pour accélérer la réparation!
Plus d'Infos... Traceback & Sys
Rendements
OriginalL'auteur Floggedhorse
Vous devez envelopper les déclarations que vous vous souciez plus étroitement. Extraire le numéro de la ligne à partir de la traceback va être impliqués et fragile.
OriginalL'auteur Ned Batchelder
Si vous restructurer le code comme ça, vous devriez obtenir un numéro de ligne lorsque l'exception est soulevée de nouveau:
SI vous le faites, à titre temporaire, le débogage de changement, vous devez afficher une trace de la pile avec les numéros de ligne lorsque l'exception se produit.
OriginalL'auteur Justin Ethier
À l'aide d'un général, sauf instruction est généralement une mauvaise programmation de la pratique, de sorte que vous devez spécifier dans votre à l'exception de l'énoncé de ce que l'exception que vous voulez prendre. ( comme l'exception ValueError: )
En outre, vous devez vous entourer avec un essai à l'exception de la structure des morceaux de code qui sont censés être le déclenchement d'une exception.
OriginalL'auteur Thomas Orozco
Modifier votre code source, de sorte que vous supprimez une ligne à la fois, jusqu'à ce que l'erreur disparaît, et qui devrait le point de vous rapprocher du problème.
OriginalL'auteur tekknolagi