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))
Cela ne semble pas fonctionner, j'obtiens une erreur de syntaxe. Quelle est la bonne façon de procéder pour enregistrer toutes sortes d'exceptions dans un fichier?
Vous devez définir le type d'exception que vous souhaitez capturer. Donc, écrivez except Exception, e:
au lieu de except, e:
pour une exception générale (qui sera enregistrée de toute façon).
Une autre possibilité consiste à écrire tout votre try/except code de cette façon:
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))
dans Python 3.x et les versions modernes de Python 2.x, utilisez except Exception as e
au lieu 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))
La syntaxe n'est plus prise en charge dans python 3. Utilisez plutôt la commande suivante.
try:
do_something()
except BaseException as e:
logger.error('Failed to do something: ' + str(e))
Mettre à jour ceci en quelque chose de plus simple pour logger (fonctionne à la fois pour Python 2 et 3). Vous n'avez pas besoin du module de traçage.
import logging
logger = logging.Logger('catch_all')
def catchEverythingInLog():
try:
... do something ...
except Exception as e:
logger.error(e, exc_info=True)
... exception handling ...
C'est maintenant l'ancienne méthode (même si elle fonctionne toujours):
import sys, traceback
def catchEverything():
try:
... some operation(s) ...
except:
exc_type, exc_value, exc_traceback = sys.exc_info()
... exception handling ...
exc_value est le message d'erreur.
Dans certains cas, vous pouvez utiliser le e.message ou e.messages .. Mais cela ne fonctionne pas dans tous les cas. Quoi qu’il en soit, le plus sûr est d’utiliser str (e)
try:
...
except Exception as e:
print(e.message)
Vous pouvez utiliser logger.exception("msg")
pour enregistrer une exception avec traceback:
try:
#your code
except Exception as e:
logger.exception('Failed: ' + str(e))
Après Python 3.6, vous pouvez utiliser un littéral de chaîne formaté. C'est chouette! ( 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}")
Si vous voulez une classe d'erreur, un message d'erreur et une trace de pile (ou l'un d'eux), utilisez sys.exec_info()
.
Code de travail minimal avec un peu de formatage,
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)
Ce qui donnera la sortie suivante,
Exception type : ZeroDivisionError
Exception message : division by zero
Stack trace : ['File : .\\test.py , Line : 5, Func.Name : <module>, Message : ans = 1/0']
Cela vous donne les détails de l'exception sur la plus récente exception. Il retourne un tuple. Voici les valeurs de nuplets (type, value, traceback)
.
traceback est une instance d'objet traceback. Vous pouvez formater la trace avec les méthodes fournies. Plus d'informations peuvent être trouvées à partir de documentation de traceback
Vous pouvez essayer de spécifier explicitement le type BaseException. Cependant, cela ne capturera que les dérivés de BaseException. Bien que cela inclue toutes les exceptions fournies par l'implémentation, il est également possible de lever des classes arbitraires de style ancien.
try:
do_something()
except BaseException, e:
logger.error('Failed to do something: ' + str(e))
Utilisez str (ex) pour imprimer une exception
try:
#your code
except ex:
print(str(ex))