captura de mensajes de excepción de 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))
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?
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, e
en 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))
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))
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)
.
traceback
es 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 .