Seite 1 von 2

Verfasst: Montag 6. Oktober 2008, 16:03
von Pekh
Dann würde ich dir mal empfehlen, die Dokumentation zum Traceback-Modul zu lesen. Da steht dann zum Beispiel drin, daß 'traceback.format_exception' drei Argumente erwartet und eine Liste zurückliefert. Was man mit minimaler Anstrengung auch aus meinem obigen Quellcode entnehmen könnte :roll:

Im Übrigen solltest du die Empfehlung von Hyperion, einfach mal ein 'raise Exception' in dein Programm zu schreiben, unbedingt befolgen. So kannst du den Logging-Mechanismus testen, ohne stundenlang warten zu müssen. Und dann wäre dir auch aufgefallen, daß das so nicht funktioniert.

Noch was: Die Verbindung rund um jeden Schreibvorgang aufzubauen und wieder zu schließen ist eine gewaltige Verschwendung von Ressourcen und dürfte dein Programm um ein Vielfaches verlangsamen. Ich gehe jedenfalls davon aus, daß da relativ oft etwas über die Schnittstelle kommt.

Verfasst: Montag 6. Oktober 2008, 17:08
von lunar
@Pekh
Wenn du anderen Leuten empfiehlst, die Doku zu lesen, stünde es dir gut an, gleiches zu tun. Dein Beispiel offenbar nämlich ebenfalls, dass du die Doku keinesfalls vollständig gelesen hast. Insofern kann man sogar froh sein, dass der OP nicht deinen obigen Quellcode übernommen hat, welcher zwar vielleicht funktioniert, aber auch nicht gerade ein Musterbeispiel für die Verwendung des logging-Moduls ist.

Hättest du die Doku zum logging Modul nämlich gelesen, dann wüsstest du, dass "logging.exception()" nichts anderes tut, als "logging.error()" mit Informationen über die Ausnahme aufzurufen. In der Doku steht sogar explizit "Call this method only from an exception handler!".

Für den Fall, dass nicht der Traceback der aktuellen Ausnahme gewünscht ist, gibt es im übrigen das Keyword-Argument "exc_info" für ".error()", welches man mit einem Tupel mit Informationen über die Ausnahme belegen kann (so wie es z.B. von sys.exc_info()" zurückgegeben wird.

Verfasst: Montag 6. Oktober 2008, 19:02
von mode
@Pekh
Mit minimaler Anstrengung kann man herausfinden, dass ich traceback.format_exc verwendet habe was nur einen optionalen Parameter erwartet. ;-)
Siehe: http://openbook.galileo-press.de/python ... 21_006.htm

Das mit der Raise Exception habe ich gemacht und es hat auch funktioniert (Stand im Logfile).

Es kommen etwa 10 Datensätze pro 24 Stunden in die DB. Von daher denke ich der "Overhead" ist zu vernachlässigen und weniger schlimm als eine Verbindung die immer offen ist und dann oft noch wieder aufgebaut werden muss weil sie in ein TImeout gelaufen ist...

VG

Mode

Verfasst: Montag 6. Oktober 2008, 19:09
von Hyperion
mode hat geschrieben:@Pekh
Mit minimaler Anstrengung kann man herausfinden, dass ich traceback.format_exc verwendet habe was nur einen optionalen Parameter erwartet. ;-)
Siehe: http://openbook.galileo-press.de/python ... 21_006.htm
Wobei ich mich eher auf die Doku beziehen würde ;-) (Nebenbei ist das Buch hier nicht gerne gesehen - es scheint viele Fehler zu haben und zu vermitteln)
Es kommen etwa 10 Datensätze pro 24 Stunden in die DB. Von daher denke ich der "Overhead" ist zu vernachlässigen und weniger schlimm als eine Verbindung die immer offen ist und dann oft noch wieder aufgebaut werden muss weil sie in ein TImeout gelaufen ist...
Das stimmt dann wohl!

Verfasst: Dienstag 7. Oktober 2008, 05:42
von Pekh
Ich habe mich aus einer (schlechten) Laune heraus dazu hinreißen lassen, in einem nicht angemessenen Tonfall Dinge zu schreiben, die so nicht in Ordnung sind. Das tut mir leid und ich möchte mich dafür entschuldigen.

Zu Lunars Antwort möchte ich noch ein paar Dinge anmerken / fragen:

1) Habe ich nicht behauptet, daß mein Beispiel das Musterbeispiel für die Verwendung des Logging-Moduls ist (aber ich wäre sehr dankbar, wenn du eines bereitstellen könntest). So wie ich es oben gepostet habe ist es bei mir im Einsatz, und ich hatte bislang keinen Grund zu klagen. Die Existenz von sys.exc_info war mir nicht bewußt, aber ich werde es bei zukünftigen Entwicklungen berücksichtigen.

2) Noch eine Verständnisfrage: Was bitte ist meine Funktion 'hook', wenn nicht ein Exceptionhandler?

Verfasst: Dienstag 7. Oktober 2008, 10:41
von lunar
Pekh hat geschrieben:1) Habe ich nicht behauptet, daß mein Beispiel das Musterbeispiel für die Verwendung des Logging-Moduls ist (aber ich wäre sehr dankbar, wenn du eines bereitstellen könntest).

Code: Alles auswählen

try:
    raise ValueError()
except:
    logging.exception('Unexpected error occured')
Oder, wenn man sys.excepthook verwenden möchte:

Code: Alles auswählen

def exception_handler(*exc_info):
    logging.error('Unexpected error occured', exc_info=exc_info)

sys.excepthook = exception_handler
Man braucht den zusätzlichen Import des traceback-Moduls nicht.
2) Noch eine Verständnisfrage: Was bitte ist meine Funktion 'hook', wenn nicht ein Exceptionhandler?
Ein Hook, der vom globalen Exceptionhandler aufgerufen wird. Die Ausnahme ist zum Zeitpunkt des Aufrufs deiner Funktion bereits "behandelt", daher gibt sys.exc_info() auch None zurück (weswegen logging.exception() in sys.excepthook() nicht ohne weiteres funktioniert).

Verfasst: Dienstag 7. Oktober 2008, 10:48
von Pekh
Vielen Dank.