captura de mensajes de excepción 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))
Esto no parece funcionar, me da error de sintaxis, ¿cuál es la forma correcta de hacer esto para registrar todo tipo de excepciones a un archivo
433
9
Tienes que definir qué tipo de excepción quieres atrapar. Así que escriba
except Exception, e:
en lugar deexcept, e:
para 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.x y las versiones modernas de Python 2.x utiliza
except Exception as e
en lugar deexcept Exception, e
:Esta sintaxis ya no es compatible con python 3. Utilice lo siguiente en su lugar.
Actualizando esto a algo más simple para el registrador (funciona tanto para la pitón 2 como para la 3). No necesitas el módulo de rastreo.
Esta es ahora la manera antigua (aunque todavía funciona):
exc_value es el mensaje de error.
Hay algunos casos en los que puedes usar el e.message o e.messages.. Pero no funciona en todos los casos. De todos modos, lo más seguro es usar el str(e)
Puedes usar
logger.exception("msg")
para la excepción de registro con rastreo:Si quieres la clase de error, el mensaje de error y el rastro de la pila (o algunos de ellos), usa
sys.exec_info()
.Código de trabajo mínimo con algún formato:
Lo que da el siguiente resultado:
[sys.exec_info()][1]
Esto le da detalles sobre la excepción más reciente. Devuelve una tupla de "tipo, valor, rastreo".
"Traceback" es una instancia de un objeto de rastreo. Puedes dar formato a la traza con los métodos proporcionados. Puedes encontrar más en la [documentación de traceback][2] .
[1]: https://docs.python.org/3.6/library/sys.html#sys.exc_info [2]: https://docs.python.org/3.6/library/traceback.html
Después de Python 3.6, puedes usar el literal de cuerda formateada. ¡Es genial! (https://docs.python.org/3/whatsnew/3.6.html#whatsnew36-pep498)
Puedes intentar especificar el tipo de BaseException explícitamente. Sin embargo, esto sólo atrapará derivados de BaseException. Aunque esto incluye todas las excepciones proporcionadas por la implementación, también es posible levantar clases arbitrarias de estilo antiguo.
Utilice str(ex) para imprimir la ejecución