re-raise mit alter Zeile und Modul?

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
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Moin!
Habe in etwa so eine Konstruktion:

Code: Alles auswählen

try:
  modul = __import__(irgendwas)
  klasse = getattr(modul, klassenname)
  obj = klasse()
  obj.variable = wert
  obj.var2 = wert2
  obj.funktion()
except Exception, e:
  if DEBUG:
    raise e # XXX
  else:
    show_friendly_but_undetailed_error_msg(e)
An der mit XXX-markierten Stelle würde ich gerne die Exception e so werfen, als wenn ich sie gar nicht erst abgefangen hätte, also so, dass im traceback auch wieder das ursprüngliche Modul und die ursprüngliche Fehlerzeile auftauchen.

Hat jemand eine Idee, wie ich das machen kann?
(Alternativ wär mir auch geholen, wenn es eine Möglichkeit gäbe, die exception nur dann abzufangen, wenn DEBUG False ist)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi henning!

Ich weiß zwar nicht, wie du wieder exakt zur fehlerauslösenden Stelle zurück kommst, aber zumindest kannst du ein paar Informationen aus dem aktuellen Traceback auslesen:

Code: Alles auswählen

except Exception, inst:
   import traceback, sys
   tb = traceback.format_tb(sys.exc_traceback)
   print "-"*80
   print "Fehler:         %s" % inst
   print "Startmodul:     %s" % sys.argv[0].strip()
   print "Zeilennummer:   %s" % traceback.tb_lineno(sys.exc_traceback)
   print "Dateiname:      %s" % tb[0].split(",")[0].strip()[6:-1]
   print "-"*80
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Supi, das löst mein Problem 100%-ig, danke!

Ich hab übrigens grad noch eine andere Möglichkeit gefunden:

Code: Alles auswählen

DEBUG = 1

try:
  # ...
except (not DEBUG) and Exception or None, e:
  # ...
Damit werden, wenn DEBUG gesetzt ist nur Exceptions vom Typ None abgefangen, die ja (hoffentlich) nicht geworfen werden :-)
Antworten