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))
Dies scheint nicht zu funktionieren, ich erhalte einen Syntaxfehler. Was ist der richtige Weg, um alle Arten von Ausnahmen in einer Datei zu protokollieren?
,
nachexcept
.,
nachexcept
, die Sie erhaltenglobal name 'e' is not defined
, die als falsche Syntax nicht viel besser ist.except Exception as e
oder seinexcept Exception, e
, abhängig von der Python-Version.Antworten:
Sie müssen definieren, welche Art von Ausnahme Sie abfangen möchten. Schreiben Sie also
except Exception, e:
stattexcept, e:
einer allgemeinen Ausnahme (die sowieso protokolliert wird).Eine andere Möglichkeit besteht darin, Ihren gesamten Try / Except-Code folgendermaßen zu schreiben:
In Python 3.x und modernen Versionen von Python 2.x wird
except Exception as e
anstelle vonexcept Exception, e
:quelle
logger.exception(e)
stattdessen verwenden. Die Ausnahme wird mit Traceback auf derselbenlogging.ERROR
Ebene protokolliert .except Exception, e:
wirft mir in Python 3 einen Syntaxfehler zu. Wird dies erwartet?except Exception as e:
Die Syntax wird in Python 3 nicht mehr unterstützt. Verwenden Sie stattdessen Folgendes.
quelle
logging.error('foo %s', str(e))
wird immere
in eine Zeichenfolge konvertiert . Um das zu erreichen, was Sie möchten, würden Sie es verwendenlogging.error('foo %s', e)
- wodurch das Protokollierungsframework die Konvertierung durchführen kann (oder nicht).logger.exception(e)
stattdessen verwenden. Die Ausnahme wird mit Traceback auf derselbenlogging.ERROR
Ebene protokolliert .except BaseException
undexcept Exception
sind nicht auf dem gleichen Niveau.except Exception
funktioniert in Python3, wird aberKeyboardInterrupt
zum Beispiel nicht abgefangen (was sehr praktisch sein kann, wenn Sie Ihren Code unterbrechen möchten!), während esBaseException
keine Ausnahmen abfängt . Unter diesem Link finden Sie die Hierarchie der Ausnahmen.Aktualisierung auf etwas einfacheres für Logger (funktioniert sowohl für Python 2 als auch für Python 3). Sie benötigen kein Traceback-Modul.
Dies ist jetzt der alte Weg (obwohl immer noch funktioniert):
exc_value ist die Fehlermeldung.
quelle
In einigen Fällen können Sie die e.message oder e.messages verwenden . Dies funktioniert jedoch nicht in allen Fällen. Umso sicherer ist es, die str (e) zu verwenden.
quelle
except Exception as e
, unde
ist einIOError
, Sie erhaltene.errno
,e.filename
unde.strerror
, aber anscheinend nichte.message
(zumindest in Python 2.7.12). Wenn Sie die Fehlermeldung erfassen möchten, verwenden Siestr(e)
wie in den anderen Antworten.Wenn Sie die Fehlerklasse, die Fehlermeldung und den Stack-Trace (oder einige davon) möchten, verwenden Sie
sys.exec_info()
.Minimaler Arbeitscode mit einigen Formatierungen:
Welches gibt die folgende Ausgabe:
Die Funktion sys.exc_info () gibt Ihnen Details zur letzten Ausnahme. Es wird ein Tupel von zurückgegeben
(type, value, traceback)
.traceback
ist eine Instanz eines Traceback-Objekts. Sie können den Trace mit den bereitgestellten Methoden formatieren. Weitere Informationen finden Sie in der Traceback-Dokumentation .quelle
e.__class__.__name__
kann kann auch die Ausnahmeklasse zurückgegeben werden.Sie können
logger.exception("msg")
zum Protokollieren von Ausnahmen mit Traceback Folgendes verwenden:quelle
e.msg
ist die Zeichenfolgendarstellung derException
Klasse.logger.exception(e)
.Nach Python 3.6 können Sie formatiertes String-Literal verwenden. Es ist ordentlich! ( https://docs.python.org/3/whatsnew/3.6.html#whatsnew36-pep498 )
quelle
Sie können versuchen, den BaseException-Typ explizit anzugeben. Dies fängt jedoch nur Ableitungen von BaseException ab. Dies schließt zwar alle von der Implementierung bereitgestellten Ausnahmen ein, es ist jedoch möglicherweise auch möglich, beliebige Klassen alten Stils auszulösen.
quelle
Verwenden Sie str (ex), um die Ausführung zu drucken
quelle
Für die zukünftigen Kämpfer ist in Python 3.8.2 (und vielleicht ein paar Versionen davor) die Syntax
quelle
Wenn Sie
str(e)
oder verwendenrepr(e)
, um die Ausnahme darzustellen, erhalten Sie nicht den tatsächlichen Stack-Trace. Daher ist es nicht hilfreich zu ermitteln, wo sich die Ausnahme befindet.Nachdem Sie andere Antworten und das Protokollierungsprotokoll gelesen haben, können Sie auf folgende Weise den eigentlichen Stack-Trace drucken, um das Debuggen zu vereinfachen:
Verwendung
logger.debug()
mit dem Parameterexc_info
verwenden
logger.exception()
oder wir können direkt verwenden
logger.exception()
, um die Ausnahme zu drucken.quelle