it-swarm.com.de

python Erfassung von Ausnahmemeldungen

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?

395
Hellnar

Sie müssen definieren, welche Art von Ausnahme Sie abfangen möchten. Schreiben Sie also except Exception, e: anstelle von except, e: für eine allgemeine Ausnahme (die trotzdem 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:
    logger.error('Failed to upload to ftp: '+ str(e))

in Python 3.x und modernen Versionen von Python 2.x wird except Exception as e anstelle von except Exception, e verwendet:

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))
559
eumiro

Die Syntax wird in python nicht mehr unterstützt. 3. Verwenden Sie stattdessen Folgendes.

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

Aktualisieren Sie dies auf etwas Einfacheres für Logger (funktioniert sowohl für python 2 als auch für 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 der alte Weg (funktioniert aber immer noch):

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.

33
berniey

In einigen Fällen können Sie e.message oder e.messages verwenden. Dies funktioniert jedoch nicht in allen Fällen. Umso sicherer ist es, str (e) zu verwenden

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

Sie können logger.exception("msg") verwenden, um Ausnahmen mit Traceback zu protokollieren:

try:
    #your code
except Exception as e:
    logger.exception('Failed: ' + str(e))
16
Peter

Wenn Sie Fehlerklasse, Fehlermeldung und Stapelablaufverfolgung (oder eine davon) möchten, verwenden Sie sys.exec_info().

Minimaler Arbeitscode mit etwas Formatierung,

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)

Welches wird folgende Ausgabe geben,

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

sys.exec_info ()

Auf diese Weise erhalten Sie Ausnahmedetails zur letzten Ausnahme. Es wird ein Tupel zurückgegeben. Es folgen die Tupel-Werte (type, value, traceback).

traceback ist eine Instanz des Traceback-Objekts. Sie können den Trace mit den angegebenen Methoden formatieren. Weitere Informationen finden Sie unter Traceback-Dokumentation

11

Nach python 3.6 können Sie formatiertes Zeichenfolgenliteral verwenden. Es ist ordentlich! ( 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}")
8
Chuan Ma

Sie können versuchen, den BaseException-Typ explizit anzugeben. Dies erfasst jedoch nur Derivate von BaseException. Dies schließt zwar alle von der Implementierung bereitgestellten Ausnahmen ein, es ist jedoch auch möglich, beliebige Klassen im alten Stil zu erstellen.

try:
  do_something()
except BaseException, e:
  logger.error('Failed to do something: ' + str(e))
4
Heini Høgnason

Verwenden Sie str (ex), um eine Ausnahme zu drucken

try:
   #your code
except ex:
   print(str(ex))
3
Niraj Trivedi