python exception message capturing

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))

Dette synes ikke at virke, jeg får en syntaksfejl, hvad er den korrekte måde at gøre dette på for at logge alle slags undtagelser til en fil?

Løsning

Du skal definere, hvilken type undtagelse du ønsker at opfange. Så skriv except Exception, e: i stedet for except, e: for en generel undtagelse (som alligevel vil blive logget).

En anden mulighed er at skrive hele din try/except-kode på denne måde:

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))

i Python 3.x og moderne versioner af Python 2.x bruger du except Exception as e i stedet for 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))
Kommentarer (6)

Syntaksen er ikke længere understøttet i python 3. Brug følgende i stedet.

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

Du kan prøve at angive BaseException-typen eksplicit. Dette vil dog kun fange afledte typer af BaseException. Selv om dette omfatter alle implementeringsleverede undtagelser, er det også muligt at udløse vilkårlige gammeldags klasser.

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