print - try else python
captura de mensajes de excepción de Python (9)
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?
Actualizar esto a algo más simple para el registrador (funciona tanto para Python 2 como para 3). No necesitas el módulo de rastreo.
import logging
logger = logging.Logger(''catch_all'')
def catchEverythingInLog():
try:
... do something ...
except Exception as e:
logger.error(e, exc_info=True)
... exception handling ...
Esta es ahora la forma antigua (aunque todavía funciona):
import sys, traceback
def catchEverything():
try:
... some operation(s) ...
except:
exc_type, exc_value, exc_traceback = sys.exc_info()
... exception handling ...
exc_value es el mensaje de error.
Después de Python 3.6, puedes usar un literal de cadena formateada. ¡Está limpio! ( https://docs.python.org/3/whatsnew/3.6.html#whatsnew36-pep498 )
try
...
except Exception as e:
logger.error(f"Failed to upload to ftp: {e}")
Hay algunos casos en los que puede utilizar el mensaje de correo electrónico o los mensajes de correo electrónico ... Pero no funciona en todos los casos. De todos modos lo más seguro es usar el str (e).
try:
...
except Exception as e:
print(e.message)
La sintaxis ya no se admite en Python 3. En su lugar, utilice la siguiente.
try:
do_something()
except BaseException as e:
logger.error(''Failed to do something: '' + str(e))
Puede intentar especificar el tipo BaseException explícitamente. Sin embargo, esto solo capturará los derivados de BaseException. Si bien esto incluye todas las excepciones proporcionadas por la implementación, también es posible que se generen clases arbitrarias de estilo antiguo.
try:
do_something()
except BaseException, e:
logger.error(''Failed to do something: '' + str(e))
Puede usar logger.exception("msg")
para registrar una excepción con el rastreo:
try:
#your code
except Exception as e:
logger.exception(''Failed: '' + str(e))
Si desea clase de error, mensaje de error y seguimiento de pila (o cualquiera de ellos), use sys.exec_info()
.
Código de trabajo mínimo con algún 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 dará salida siguiente salida,
Exception type : ZeroDivisionError
Exception message : division by zero
Stack trace : [''File : .//test.py , Line : 5, Func.Name : <module>, Message : ans = 1/0'']
Esto le da los detalles de excepción sobre la excepción más reciente. Se devuelve una tupla. Los siguientes son los valores de la tupla (type, value, traceback)
.
traceback es una instancia del objeto traceback. Puede formatear la traza con los métodos proporcionados. Más se puede encontrar en la documentación de rastreo
Tienes que definir qué tipo de excepción quieres atrapar. Entonces escriba except Exception, e:
lugar de except, e:
para una excepción general (que se registrará de todos modos).
Otra posibilidad es escribir todo tu 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, e:
logger.error(''Failed to upload to ftp: ''+ str(e))
en Python 3.xy las versiones modernas de Python 2.x usan except Exception as e
lugar de 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))
Utilice str (ex) para imprimir execption
try:
#your code
except ex:
print(str(ex))