Obtenir des détails de l'exception en Python
Je dois ouvrir & écrire à environ 10 fichiers différents, tous dans la même boucle.
e.g:
for i in range(0,10):
try:
a=5
file1 = open("file1.txt",'w+')
file2 = open("file2.txt",'w+')
#... etc
print(str(a),file=file1)
print(str(a)+"hi",file=file2)
# ... etc
except:
#error handling
Maintenant ce que je voudrais faire est d'être en mesure d'obtenir des informations d'exception comme ce fichier a été ouvert, écrit à l'intérieur de l'exception d'ordre général. À partir de mes connaissances actuelles, je dois faire quelque chose de ce genre pour obtenir ce que je veux:
for i in range(0,5):
a=5
try:
file1 = open("file1.txt",'w+')
print(str(a),file=file1)
except:
#error handling for file1
try:
file2 = open("file2.txt",'w+')
print(str(a)+"hi",file=file2)
except:
#error handling for file2
...Qui va devenir extrêmement maladroit et peu attrayant quand je dois faire cela pendant environ 10 fichiers différents. Est-il possible de l'obtenir (par exemple) le nom du fichier info de une exception générale comme dans mon premier exemple? Fondamentalement donc, l'exception pourrait le rapport des choses comme "erreur lors de l'écriture de fichier1" sans un try/except spécifiquement pour fichier1 opérations.
edit: C'est un massif de simplification des données écrites sur le fichier. str () et str(a)+"salut" ne sont pas vraiment de bonnes représentations des données réellement écrit; fichier1 peut avoir besoin d'un entier codé en dur, où fichier2 peuvent avoir besoin d'une chaîne formatée avec de multiples variables. pour généraliser l'ouverture/écriture dans une boucle n'est pas un travail très bien.
OriginalL'auteur user891876 | 2013-04-08
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
sys.exc_info
pour obtenir des informations sur l'exception en cours de traitement, y compris l'exception de l'objet lui-même. UnIOError
exception contient toutes les informations dont vous avez besoin, y compris le nom de fichier, le errno, et une chaîne de caractères décrivant l'erreur:D'exécution dans le
try
bloc sera bien évidemment toujours interrompue après la première exception.OriginalL'auteur Cairnarvon
Utiliser le traceback module:
OriginalL'auteur rstackhouse
Vous mentionner l'aide d'une boucle, mais vous n'êtes pas vraiment à l'aide d'une boucle. Utiliser une boucle. De cette façon, vous pouvez écrire chaque fichier, un à la fois, à l'intérieur d'un seul
try
bloc. Vous ne semblent pas être à faire quelque chose avec les fichiers sauf écrire une valeur à chacun, de sorte que vous n'avez pas besoin de les garder ouverts.Edit: Si vous avez très différentes choses à écrire pour les différents fichiers, de créer un dictionnaire ou d'autres structures de données à l'avance le stockage de la correspondance entre les fichiers et les données, utilisez-la dans la boucle.
Voir mon édité réponse. Arranger le temps la relation entre les fichiers et les données, puis d'écrire chaque élément de données de son fichier associé dans la boucle.
que faire si je ne veux pas l'impression de fichier3 si la longueur(str(a)+str(b))>5? chaque fichier doit certainement sa propre logique.
Puis, dans les calculs initiaux, mettre la chaîne vide comme valeur pour
file3
dans ce cas. Ou vous pourriez inclure une vérification simple de la boucle pour un "ne pas écrire" la valeur n'a rien de pareil, et Aucune dans les valeurs précalculées. Le point est que vous pouvez décider ce que vous allez écrire pour chaque fichier avant de commencer à ouvrir les fichiers.Plus généralement, le plus compliqué de la logique est de décider quoi faire avec chaque fichier, au moins, vous pouvez éviter de "maladroit" de code. Si vous essayez de faire 10 totalement différents ensembles d'opérations complexes à 10 fichiers, ce n'est pas une opération, c'est 10 opérations, et vous ne pouvez pas vous attendre à être en mesure de les faire tous à la fois. Autant que possible, cependant, vous devez faire le maladroit partie avant de vous ouvrir les fichiers, car cela aidera à séparer les erreurs de logique dans la création des données (qui sont sous votre contrôle) des erreurs d'e/S lors de l'écriture de données (qui peut ne pas être sous votre contrôle).
OriginalL'auteur BrenBarn
Lors de l'utilisation de
exc_type, value, exc_traceback = sys.exc_info()
, notez que le nom de fichier généré à l'exception peut être obtenu de la manière suivante:OriginalL'auteur ranaalisaeed