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, me sale un error de sintaxis, ¿cuál es la forma correcta de hacerlo para registrar todo tipo de excepciones en un archivo?
,
despuésexcept
.,
afterexcept
, obtendráglobal name 'e' is not defined
, que no es mucho mejor que la sintaxis incorrecta.except Exception as e
oexcept Exception, e
, dependiendo de la versión de Python.Respuestas:
Debe definir qué tipo de excepción desea capturar. Por lo tanto, escriba en
except Exception, e:
lugar deexcept, e:
una excepción general (que se registrará de todos modos).Otra posibilidad es escribir todo el código try / except de esta manera:
en Python 3.xy las versiones modernas de Python 2.x usan en
except Exception as e
lugar deexcept Exception, e
:fuente
logger.exception(e)
en su lugar. Registrará la excepción con rastreo en el mismologging.ERROR
nivel.except Exception, e:
me arroja un error de sintaxis en Python 3. ¿Se espera esto?except Exception as e:
La sintaxis ya no es compatible con Python 3. Utilice lo siguiente en su lugar.
fuente
logging.error('foo %s', str(e))
siempre se convertiráe
en una cadena. Para lograr lo que busca, usaríalogging.error('foo %s', e)
, permitiendo así que el marco de registro realice (o no) la conversión.logger.exception(e)
en su lugar. Registrará la excepción con rastreo en el mismologging.ERROR
nivel.except BaseException
yexcept Exception
no están en el mismo nivel.except Exception
funciona en Python3, pero no se capturará,KeyboardInterrupt
por ejemplo (¡lo que puede ser muy conveniente si desea poder interrumpir su código!), mientras queBaseException
detecta cualquier excepción. Vea este enlace para la jerarquía de excepciones.Actualizando esto a algo más simple para logger (funciona tanto para python 2 como para 3). No necesita el módulo de rastreo.
Esta es ahora la forma antigua (aunque todavía funciona):
exc_value es el mensaje de error.
fuente
Hay algunos casos en los que puede usar el mensaje electrónico o los mensajes electrónicos . Pero no funciona en todos los casos. De todos modos, lo más seguro es usar el str (e)
fuente
except Exception as e
, ye
es unaIOError
, se obtienee.errno
,e.filename
ye.strerror
, aunque aparentemente no haye.message
(al menos en Python 2.7.12). Si desea capturar el mensaje de error, usestr(e)
, como en las otras respuestas.Si desea la clase de error, el mensaje de error y el seguimiento de la pila (o algunos de esos), use
sys.exec_info()
.Código de trabajo mínimo con algún formato:
Lo que da el siguiente resultado:
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 la traza con los métodos proporcionados. Se puede encontrar más en la documentación de rastreo .fuente
e.__class__.__name__
puede devolver la clase de excepción.Puede usar
logger.exception("msg")
para registrar excepciones con rastreo:fuente
e.msg
es la representación en cadena de laException
clase.logger.exception(e)
.Después de python 3.6, puede usar cadenas formateadas literales. ¡Está ordenado! ( https://docs.python.org/3/whatsnew/3.6.html#whatsnew36-pep498 )
fuente
Puede intentar especificar el tipo BaseException explícitamente. Sin embargo, esto solo capturará derivados de BaseException. Si bien esto incluye todas las excepciones proporcionadas por la implementación, también es posible generar clases arbitrarias de estilo antiguo.
fuente
Use str (ex) para imprimir la ejecución
fuente
Para los futuros luchadores, en Python 3.8.2 (y quizás algunas versiones anteriores), la sintaxis es
fuente
Usando
str(e)
orepr(e)
para representar la excepción, no obtendrá el seguimiento real de la pila, por lo que no es útil encontrar dónde está la excepción.Después de leer otras respuestas y el documento del paquete de registro, las siguientes dos formas funcionan muy bien para imprimir el seguimiento real de la pila para una depuración más fácil:
usar
logger.debug()
con parámetroexc_info
utilizar
logger.exception()
o podemos usar directamente
logger.exception()
para imprimir la excepción.fuente