web-dev-qa-db-fra.com

Comment enregistrer une erreur dans un fichier et ne pas échouer à l'exception

Je télécharge un fichier sur le net et il échoue même si je fais:

pour p dans la requête:

try:

except IOError as e:
   print e;

S'il y a une erreur, je veux l'enregistrer, puis continuer avec le fichier suivant.

Dans cette boucle, j'essaie de télécharger une image, si pour une raison quelconque le nom de fichier était incorrect, ou le site Web était en panne, etc., je veux continuer avec l'élément suivant dans la boucle for.

Y a-t-il une erreur plus générique qui n'échouera pas et continuera le traitement?

De plus, comment puis-je enregistrer des erreurs dans un fichier?

22
Blankman

Comme l'a souligné Lott, si un téléchargement échoue, à moins que le problème ne soit résolu en amont (ou avec votre adresse de téléchargement), le mieux que vous puissiez faire est de réessayer. Cependant, si la situation est que vous avez une liste de téléchargements et que vous souhaitez simplement ignorer les téléchargements ayant échoué au lieu de quitter, alors:

logf = open("download.log", "w")
for download in download_list:
    try:
        # code to process download here
    except Exception as e:     # most generic exception you can catch
        logf.write("Failed to download {0}: {1}\n".format(str(download), str(e)))
        # optional: delete local version of failed download
    finally:
        # optional clean up code
        pass

À noter:

(1) L'utilisation du module "logging", comme suggéré par ~ unutbu, vous donne beaucoup plus de flexibilité et de puissance avec votre sortie de journalisation, y compris l'horodatage, l'écriture simultanée sur différents canaux (par exemple, stderr, fichier) en fonction des niveaux d'erreur, etc. etc.

(2) Vous pourriez envisager d'implémenter la logique ci-dessus en utilisant la construction "with".

16
Jeet

Vous pouvez utiliser le module de journalisation :

import logging
logging.basicConfig(filename='/tmp/myapp.log', level=logging.DEBUG, 
                    format='%(asctime)s %(levelname)s %(name)s %(message)s')
logger=logging.getLogger(__name__)

try:
    1/0
except ZeroDivisionError as err:
    logger.error(err)

L'exécution du script écrit dans /tmp/myapp.log:

% cat /tmp/myapp.log 
2010-08-01 17:50:45,960 ERROR __main__ integer division or modulo by zero
22
unutbu

Cela va écrire votre erreur dans un fichier journal et continuer à exécuter le code.

import traceback

#This line opens a log file
log = open("log.txt", "w")

try:
    # some code
    # Below line will print any print to log file as well.
    print("Creating DB Connection", file = log)
except Exception:
    traceback.print_exc(file=log)
    continue
8
Avinav Mishra

Cela attrape tout. Mais il est beaucoup, beaucoup mieux de saisir l'exception exacte. python <= 2,7

while True:
  try:
    doStuff()
  except Exception, e:
    f = open('log.txt', 'w')
    f.write('An exceptional thing happed - %s' % e)
    f.close()
3
nate c