Python Script beendet sich selbst - warum?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Beitragvon Pekh » Montag 6. Oktober 2008, 16:03

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.
lunar

Beitragvon lunar » Montag 6. Oktober 2008, 17:08

@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.
Benutzeravatar
mode
User
Beiträge: 10
Registriert: Samstag 4. Oktober 2008, 17:14

Beitragvon mode » Montag 6. Oktober 2008, 19:02

@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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7471
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Montag 6. Oktober 2008, 19:09

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!
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Beitragvon Pekh » Dienstag 7. Oktober 2008, 05:42

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?
lunar

Beitragvon lunar » Dienstag 7. Oktober 2008, 10:41

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).
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Beitragvon Pekh » Dienstag 7. Oktober 2008, 10:48

Vielen Dank.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder