947 Stimmen

python ausnahme meldung aufzeichnen

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 Syntaxfehler, was ist der richtige Weg, dies zu tun für die Protokollierung aller Arten von Ausnahmen in eine Datei

3 Stimmen

Ihr Einzug ist fehlerhaft. Und lassen Sie das , après except .

4 Stimmen

@SvenMarnach, wenn Sie das , après except erhalten Sie global name 'e' is not defined was nicht viel besser ist als eine falsche Syntax.

20 Stimmen

@Val: Sollte sein except Exception as e o except Exception, e je nach Python-Version.

1246voto

eumiro Punkte 193562

Sie müssen festlegen, welche Art von Ausnahme Sie abfangen wollen. Schreiben Sie also except Exception, e: anstelle von except, e: für eine allgemeine Ausnahme (die ohnehin protokolliert wird).

Eine andere Möglichkeit ist, den gesamten try/except-Code auf diese Weise zu schreiben:

try:
    with open(filepath,'rb') as f:
        con.storbinary('STOR '+ filepath, f)
    logger.info('File successfully uploaded to '+ FTPADDR)
except Exception, e: # work on python 2.x
    logger.error('Failed to upload to ftp: '+ str(e))

in Python 3.x und modernen Versionen von Python 2.x verwenden except Exception as e anstelle von 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: # work on python 3.x
    logger.error('Failed to upload to ftp: '+ str(e))

279 Stimmen

Repr(e) liefert die Ausnahme (und die Zeichenfolge der Meldung); str(e) liefert nur die Zeichenfolge der Meldung.

0 Stimmen

@whitebeard. Danke, dass Sie den Clickbait entschärft haben, zumal er irreführend ist (Sie wollen wahrscheinlich die str ).

21 Stimmen

Als Alternative für die Protokollierung von Ausnahmen könnten Sie verwenden logger.exception(e) stattdessen. Es protokolliert die Ausnahme mit Traceback an der gleichen logging.ERROR Ebene.

394voto

sjtaheri Punkte 4079

Die Syntax wird in Python 3 nicht mehr unterstützt. Verwenden Sie stattdessen die folgende.

try:
    do_something()
except BaseException as e:
    logger.error('Failed to do something: ' + str(e))

3 Stimmen

Eigentlich sollten Sie logger.error('Failed to do something: %s', str(e)) verwenden. Auf diese Weise wird die String-Interpolation nicht durchgeführt, wenn Ihr Logger-Level über error liegt.

12 Stimmen

@avyfain - Sie liegen falsch. Die Aussage logging.error('foo %s', str(e)) wird immer konvertieren e zu einer Zeichenkette. Um das zu erreichen, was Sie suchen, würden Sie verwenden logging.error('foo %s', e) - Dadurch kann das Logging Framework die Konvertierung vornehmen (oder auch nicht).

0 Stimmen

Sind Sie sich da sicher, @RonDahlgren? Ich hatte den Eindruck, dass logging.error('message %s', expression) wurde unabhängig vom Ausdruck faul ausgewertet und interpoliert die Zeichenkette nur, wenn das Protokoll tatsächlich irgendwo ausgegeben werden soll.

99voto

Kavindu Dodanduwa Punkte 10739

Wenn Sie die Fehlerklasse, die Fehlermeldung und den Stacktrace benötigen, verwenden Sie sys.exc_info() .

Minimaler funktionierender Code mit einigen Formatierungen:

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)

Das Ergebnis ist die folgende Ausgabe:

Exception type : ZeroDivisionError
Exception message : division by zero
Stack trace : ['File : .\\test.py , Line : 5, Func.Name : <module>, Message : ans = 1/0']

Die Funktion sys.exc_info() finden Sie Einzelheiten über die letzte Ausnahme. Sie gibt ein Tupel von (type, value, traceback) .

traceback ist eine Instanz des Traceback-Objekts. Sie können den Trace mit den bereitgestellten Methoden formatieren. Mehr dazu finden Sie in der Traceback-Dokumentation .

6 Stimmen

Verwendung von e.__class__.__name__ kann auch die Ausnahmeklasse zurückgeben.

1 Stimmen

Danke für die Info, entscheide mich schließlich für die Verwendung self.logger.info("{} - {}".format(type(error).__name__, str(error))) funktioniert wie ein Zauber.

69voto

Slipstream Punkte 11219

Es gibt einige Fälle, in denen Sie die e.Nachricht o e.Nachrichten .. Aber das funktioniert nicht in allen Fällen. Am sichersten ist es, die str(e)

try:
  ...
except Exception as e:
  print(e.message)

66 Stimmen

Das Problem dabei ist, dass Sie zum Beispiel, wenn Sie except Exception as e y e ist ein IOError erhalten Sie e.errno , e.filename y e.strerror aber offensichtlich nicht e.message (zumindest in Python 2.7.12). Wenn Sie die Fehlermeldung erfassen wollen, verwenden Sie str(e) wie in den anderen Antworten.

0 Stimmen

@epalm Was, wenn Sie den IOError vor der Exception abfangen?

2 Stimmen

@HeribertoJuárez Warum sollten Sie Sonderfälle abfangen, wenn Sie sie einfach in einen String umwandeln können?

55voto

berniey Punkte 2592

Aktualisierung dieser zu etwas einfacher für Logger (funktioniert sowohl für Python 2 und 3). Sie benötigen kein Traceback-Modul.

import logging

logger = logging.Logger('catch_all')

def catchEverythingInLog():
    try:
        ... do something ...
    except Exception as e:
        logger.error(e, exc_info=True)
        ... exception handling ...

Das ist jetzt die alte Methode (die aber immer noch funktioniert):

import sys, traceback

def catchEverything():
    try:
        ... some operation(s) ...
    except:
        exc_type, exc_value, exc_traceback = sys.exc_info()
        ... exception handling ...

exc_value ist die Fehlermeldung.

3 Stimmen

Dies wäre die von mir bevorzugte Methode. Nur Drucken der Zeichenfolge ist nützlich für die Protokollierung ich vermute, aber wenn ich etwas mit dieser Information tun müssen, ich brauche mehr als nur eine Zeichenfolge.

3 Stimmen

Im zweiten Beispiel ist es nicht nötig, "traceback" zu importieren, richtig?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X