sys.exepthook -> zum loggen wieder eine exception bauen?

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.
Antworten
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Hallo,

folgendes Problem:
Ich will in meinem Programm alle nicht gehandleten Exceptions auf meinen Logger umleiten und danach das Programm beenden.
Bisher habe ich dies mit einem großen try: except gemacht, da dies aber furstbar hässlich ist wollte ich dies nun so umschreiben, dass ich mich an den sys.exepthook zu hängen.
Leider bekomme ich da aber nicht die Exception sondern nur type, value, traceback.
Mache ich nun ein logging.exception(value) habe ich statt einem trace aber nur ein None da stehen.
Ich möchte nun aber die Informationen die ich mit meinem großen try hatte auch hier haben.
Also statt:

Code: Alles auswählen

2012-10-04 23:49:57,535 [ERROR   ] integer division or modulo by zero
None
wieder

Code: Alles auswählen

2012-10-04 23:49:57,416 [ERROR   ] integer division or modulo by zero
Traceback (most recent call last):
  File "foo.py", line 70, in <module>
    1 / 0
ZeroDivisionError: integer division or modulo by zero
Kann ich das irgendwie machen oder gehen diese Informationen hier verloren?
Warum wird sys.excephook nicht einfach die entsprechende exception übergeben und der holt sich dann die Argumente daraus?
Hier mein Code:

Code: Alles auswählen

import logging
try:
    1/0
except Exception, e:
    logging.exception(e)
vs.

Code: Alles auswählen

import logging
import sys
def log_exepthook(type, value, traceback):
        value.exc_info = traceback
        mainlog.exception(value)

sys.excepthook = log_exepthook
1 / 0
Bis später

p90
BlackJack

@p90: Was ist denn an einem einfachen ``try``/``except`` „furchtar hässlich”? Es ist kürzer, direkter, und man sieht sofort was Sache ist.
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Naja, solange das Programm relativ klein ist geht das aber wenn man 2000 Zeilen zwischen dem try und except wird das ganze etwas unübersichtlich. Wenn ich das mit dem exceptionhook hin bekomme habe ich genau das was ich brauche. Ich will nämlich immer eine Email mit dem Fehler bekommen wenn das Programm abstürzt. Im Idealfall sollte da natürlich nicht passieren aber wenn doch sehe ich es sofort, fixe den Bug und starte das Programm neu.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

@p90: Benutze halt Funktionen:

Code: Alles auswählen

import logging

def main():
    pass # <-- platz für 2000 Zeilen (aufgeteilt auf weitere Funktionen)!

if __name__ == '__main__':
    try:
        main() 
    except Exception, e:
        logging.exception(e)
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Naja gut.
Habs jetzt so gemacht wie gkuhl es vorgeschlagen hat.
Würde trotzdem gerne wissen wie man das machen würde.
Weil exepthook ist doch genau die Funktion die mir wenn ich den Interpreter offen habe diesen tollen Text mit dem Trace hinschreibt. Die Funktion hat die Informationen also, ich muss si enur richtig zusammen bauen.
BlackJack

@p90: Schau Dir mal das `traceback`-Modul an.
Antworten