captura de mensajes de excepción de Python

Resuelto Hellnar asked hace 13 años • 15 respuestas
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))

Esto no parece funcionar, aparece un error de sintaxis, ¿cuál es la forma correcta de hacerlo para registrar todo tipo de excepciones en un archivo?

Hellnar avatar Jan 14 '11 18:01 Hellnar
Aceptado

Tienes que definir qué tipo de excepción quieres detectar. Entonces escriba except Exception as e:en lugar de except, e:para una excepción general.

Otra posibilidad es escribir todo el código try/except de esta manera:

try:
    with open(filepath,'rb') as f:
        con.storbinary('STOR '+ filepath, f)
    logger.info('File successfully uploaded to '+ FTPADDR)
except Exception as e:      # works on python 3.x
    logger.error('Failed to upload to ftp: %s', repr(e))

En versiones anteriores de Python 2.x, utilice except Exception, een lugar de except Exception as e:

try:
    with open(filepath,'rb') as f:
        con.storbinary('STOR '+ filepath, f)
    logger.info('File successfully uploaded to %s', FTPADDR)
except Exception, e:        # works on python 2.x
    logger.error('Failed to upload to ftp: %s', repr(e))
eumiro avatar Jan 14 '2011 11:01 eumiro

La sintaxis ya no es compatible con Python 3. Utilice lo siguiente en su lugar.

try:
    do_something()
except BaseException as e:
    logger.error('Failed to do something: ' + str(e))
sjtaheri avatar Jan 25 '2013 20:01 sjtaheri

Si desea la clase de error, el mensaje de error y el seguimiento de la pila, utilice sys.exc_info().

Código de trabajo mínimo con algo de formato:

import sys
import traceback

try:
    ans = 1/0
except BaseException as ex:
    # Get current system exception
    ex_type, ex_value, ex_traceback = sys.exc_info()

    # Extract unformatter stack traces as tuples
    trace_back = traceback.extract_tb(ex_traceback)

    # Format stacktrace
    stack_trace = list()

    for trace in trace_back:
        stack_trace.append("File : %s , Line : %d, Func.Name : %s, Message : %s" % (trace[0], trace[1], trace[2], trace[3]))

    print("Exception type : %s " % ex_type.__name__)
    print("Exception message : %s" %ex_value)
    print("Stack trace : %s" %stack_trace)

Lo que da el siguiente resultado:

Exception type : ZeroDivisionError
Exception message : division by zero
Stack trace : ['File : .\\test.py , Line : 5, Func.Name : <module>, Message : ans = 1/0']

La función sys.exc_info() le brinda detalles sobre la excepción más reciente. Devuelve una tupla de (type, value, traceback).

tracebackes una instancia de objeto de rastreo. Puede formatear el seguimiento con los métodos proporcionados. Puede encontrar más información en la documentación de rastreo .

Kavindu Dodanduwa avatar Apr 02 '2018 14:04 Kavindu Dodanduwa