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 le faire pour enregistrer toutes sortes d'exceptions dans un fichier
,
aprèsexcept
.,
suitexcept
, vous obtiendrezglobal name 'e' is not defined
, ce qui n'est pas beaucoup mieux qu'une mauvaise syntaxe.except Exception as e
ouexcept Exception, e
, selon la version de Python.Réponses:
Vous devez définir le type d'exception que vous souhaitez intercepter. Écrivez donc
except Exception, e:
au lieu deexcept, e:
pour une exception générale (qui sera enregistrée de toute façon).Une autre possibilité consiste à écrire l'intégralité de votre code try / except de cette façon:
dans Python 3.x et les versions modernes de Python 2.x utilisent
except Exception as e
au lieu deexcept Exception, e
:la source
logger.exception(e)
place. Il enregistrera l'exception avec traceback au mêmelogging.ERROR
niveau.except Exception, e:
me renvoie une erreur de syntaxe en python 3. Est-ce attendu?except Exception as e:
La syntaxe n'est plus prise en charge dans python 3. Utilisez plutôt ce qui suit.
la source
logging.error('foo %s', str(e))
sera toujours convertiee
en chaîne. Pour réaliser ce que vous êtes, vous utiliseriezlogging.error('foo %s', e)
- permettant ainsi au cadre de journalisation de faire (ou non) la conversion.logger.exception(e)
place. Il enregistrera l'exception avec traceback au mêmelogging.ERROR
niveau.except BaseException
etexcept Exception
ne sont pas au même niveau.except Exception
fonctionne en Python3, mais il n'interceptera pasKeyboardInterrupt
par exemple (ce qui peut être très pratique si vous voulez être en mesure d'interrompre votre code!), alors qu'ilBaseException
intercepte toute exception. Voir ce lien pour la hiérarchie des exceptions.Mise à jour de quelque chose de plus simple pour l'enregistreur (fonctionne pour python 2 et 3). Vous n'avez pas besoin de module de traceback.
C'est maintenant l'ancienne méthode (bien qu'elle fonctionne toujours):
exc_value est le message d'erreur.
la source
Il existe certains cas où vous pouvez utiliser l' e.message ou les e.messages .. Mais cela ne fonctionne pas dans tous les cas. Quoi qu'il en soit, le plus sûr est d'utiliser le str (e)
la source
except Exception as e
ete
est unIOError
, vous obteneze.errno
,e.filename
ete.strerror
, mais apparemment pase.message
(au moins en Python 2.7.12). Si vous souhaitez capturer le message d'erreur, utilisezstr(e)
, comme dans les autres réponses.Si vous voulez la classe d'erreur, le message d'erreur et la trace de pile (ou certains d'entre eux), utilisez
sys.exec_info()
.Code de travail minimal avec une mise en forme:
Ce qui donne la sortie suivante:
La fonction sys.exc_info () vous donne des détails sur l'exception la plus récente. Il renvoie un tuple de
(type, value, traceback)
.traceback
est une instance de l'objet traceback. Vous pouvez formater la trace avec les méthodes fournies. Plus d'informations peuvent être trouvées dans la documentation traceback .la source
e.__class__.__name__
peut également renvoyer la classe d'exception.Vous pouvez utiliser
logger.exception("msg")
pour la journalisation des exceptions avec traceback:la source
e.msg
est la représentation sous forme de chaîne de laException
classe.logger.exception(e)
.Après python 3.6, vous pouvez utiliser un littéral de chaîne formaté. C'est bien! ( https://docs.python.org/3/whatsnew/3.6.html#whatsnew36-pep498 )
la source
Vous pouvez essayer de spécifier explicitement le type BaseException. Cependant, cela ne capturera que les dérivés de BaseException. Bien que cela comprenne toutes les exceptions fournies par l'implémentation, il est également possible d'élever des classes arbitraires à l'ancienne.
la source
Utilisez str (ex) pour imprimer l'exception
la source
pour les futurs lutteurs, en python 3.8.2 (et peut-être quelques versions avant cela), la syntaxe est
la source
En utilisant
str(e)
ourepr(e)
pour représenter l'exception, vous n'obtiendrez pas la trace de pile réelle, il n'est donc pas utile de trouver où se trouve l'exception.Après avoir lu les autres réponses et le doc du package de journalisation, les deux méthodes suivantes fonctionnent très bien pour imprimer la trace de la pile réelle pour un débogage plus facile:
utiliser
logger.debug()
avec paramètreexc_info
utilisation
logger.exception()
ou nous pouvons directement utiliser
logger.exception()
pour imprimer l'exception.la source