capture des messages d'exception en python

import ftplib
import urllib2
import os
import logging
logger = logging.getLogger('ftpuploader')
hdlr = logging.FileHandler('ftplog.log')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.INFO)
FTPADDR = "some ftp address"

def upload_to_ftp(con, filepath):
    try:
        f = open(filepath,'rb')                # file to send
        con.storbinary('STOR '+ filepath, f)         # Send the file
        f.close()                                # Close file and FTP
        logger.info('File successfully uploaded to '+ FTPADDR)
    except, e:
        logger.error('Failed to upload to ftp: '+ str(e))

Cela ne semble pas fonctionner, j'obtiens une erreur de syntaxe. Quelle est la bonne façon de procéder pour enregistrer toutes sortes d'exceptions dans un fichier ?

Solution

Vous devez définir le type d'exception que vous voulez attraper. Ainsi, écrivez except Exception, e: au lieu de except, e: pour une exception générale (qui sera de toute façon enregistrée).

Une autre possibilité est d'écrire tout votre code try/except de cette façon :

try:
    with open(filepath,'rb') as f:
        con.storbinary('STOR '+ filepath, f)
    logger.info('File successfully uploaded to '+ FTPADDR)
except Exception, e:
    logger.error('Failed to upload to ftp: '+ str(e))

dans Python 3.x et les versions modernes de Python 2.x, utilisez except Exception as e au lieu de except Exception, e :

try:
    with open(filepath,'rb') as f:
        con.storbinary('STOR '+ filepath, f)
    logger.info('File successfully uploaded to '+ FTPADDR)
except Exception as e:
    logger.error('Failed to upload to ftp: '+ str(e))
Commentaires (6)

Cette syntaxe n'est plus prise en charge dans python 3. Utilisez plutôt la syntaxe suivante.

try:
    do_something()
except BaseException as e:
    logger.error('Failed to do something: ' + str(e))
Commentaires (8)

Vous pouvez essayer de spécifier le type BaseException de manière explicite. Toutefois, cela ne permettra d'attraper que les dérivés de BaseException. Bien que cela comprenne toutes les exceptions fournies par l'implémentation, il est également possible de lever des classes arbitraires de type ancien.

try:
  do_something()
except BaseException, e:
  logger.error('Failed to do something: ' + str(e))
Commentaires (0)