Frage

Ich verwende eine PyQt4 Benutzeroberfläche. Ich habe umgeleitet stderr in eine Log-Datei für die einfache Fehlersuche und Fehlersuche, aber jetzt brauche ich Fehlermeldungen an den Benutzer angezeigt wird, wenn ein Fehler auftritt.

Mein Problem ist, dass ich brauche, um eine Ausnahme zu fangen, wenn es der Benutzer geschieht und lassen Sie wissen, dass es passiert ist, aber wir immer noch die Zurückverfolgungs auf stderr (das heißt die Protokolldatei) propagieren.

Wenn ich etwas tun, wie folgt aus:

def updateResults(self):
    try:
        #code that updates the results
    except:
        #display error message box

Das wird die Ausnahme abfangen und nicht in das Fehlerprotokoll propagieren.

Gibt es eine Möglichkeit, die Benutzer die Nachricht zu zeigen, und dann weiter um den Fehler zu propagieren?

Würde das funktionieren?

except, e:
    #display error message box
    raise e

Gibt es einen besseren Weg, um mein Ziel zu erreichen?

War es hilfreich?

Lösung

Ich glaube, Sie darüber in der falschen Art und Weise denken. Sie sollten nicht einfach wieder die Erhöhung der Fehler werden es einzuloggen weiter auf der ganzen Linie. Der cannonical Weg, dies in Python zu tun, ist das Protokollierungsmodul zu verwenden. Angepasst von der Dokumentation:

import logging
LOG_FILENAME = '/tmp/logging_example.out'
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG,)

...

try:
    # code
except:
    logging.debug('Something bad happened', exc_info=True)
    # display message box
    # raise (if necessary)

Das gibt weit ein flexibleres Logging-System als die sich auf Fehler auf sys.stdout erzeugt. Sie können nicht die Ausnahme erneut erhöhen müssen, wenn Sie von der Ausnahme in irgendeiner Weise zu erholen.

Andere Tipps

Genau, aber man kann nur

raise

, welche die aktuell behandelte Ausnahme erneut anheben wird.

Einige zusätzliche Informationen:

(Mit PyQt4) Sie werden auch sys.excepthook auf Ihre eigene Funktion erneut zu binden müssen alle abgefangene Ausnahmen zu fangen. PyQt wird sie nur an die Konsole sonst drucken, das kann nicht sein, was Sie brauchen ...

import sys

def excepthook(exc_type, exc_val, tracebackobj):
    # do something useful with the uncaught exception
    ...

def main():
    # rebind excepthook
    sys.excepthook = excepthook
    ...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top