Seite 1 von 1
bei einer Exception die Zeile ermitteln
Verfasst: Freitag 14. September 2007, 10:31
von Twilo
Hallo,
wie kann ich die Zeile ermitteln, in welcher die Exception ausgelöst wurde?
gibt mir nur die Fehlermeldung aus, jedoch nicht die Zeile
wenn ich in der python-Shell ein Exception auslöse, wird mir die Zeilennummer mit ausgegeben.
e()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'e' is not defined
wie kann ich die Zeilennummer ausgeben, wenn ich exception abfange?
Im
python Tutorial unter
Errors and Exceptions bin ich leider nicht fündig geworden.
mfg
Twilo
Verfasst: Freitag 14. September 2007, 10:37
von gerold
Hallo Twilo!
Hier hast du ein Beispiel:
http://www.python-forum.de/post-47195.html#47195
mfg
Gerold

Verfasst: Freitag 14. September 2007, 10:51
von Twilo
Hallo,
danke
das wäre doch sicherlich etwas für das Tutorial
mfg
Twilo
Verfasst: Freitag 14. September 2007, 11:06
von Twilo
Hallo,
dein Beispiel gibt mir leider nicht die Zeilennummer aus, wo das urspüngliche Problem auftritt.
> Fehler: global name 'e' is not defined
> Startmodul: /home/xxx/cvs/xxx/xxx/python/imports/a.py
> Zeilennummer: 828
> Dateiname: /home/xxx/cvs/xxx/xxx/python/model/b.py
das Problem tritt in der Datei a.py in Zeile 38 auf.
In Zeile 828 der Datei b.py wird eine Methode in der Datei a.py aufgerufen, wo das Problem auftritt.
Wie komme ich an die Zeile 38 der Datei a.py?
mfg
Twilo
Verfasst: Freitag 14. September 2007, 11:26
von gerold
Twilo hat geschrieben:> Fehler: global name 'e' is not defined
> Startmodul: /home/xxx/cvs/xxx/xxx/python/imports/a.py
> Zeilennummer: 828
> Dateiname: /home/xxx/cvs/xxx/xxx/python/model/b.py
das Problem tritt in der Datei a.py in Zeile 38 auf.
In Zeile 828 der Datei b.py wird eine Methode in der Datei a.py aufgerufen, wo das Problem auftritt.
Hallo Twilo!
Du hast nicht nur *ein* Problem.
Du startest das Modul "a.py". Von diesem Modul aus importierst du "b.py". "b.py" importiert "a.py". So etwas geht in den seltensten Fällen gut. Zumindest bedeutet das für mich, dass du das Programm noch einmal anders planen solltest. Wenn "b.py" nicht ohne "a.py" auskommt, dann solltst du auf "b.py" verzichten und alles in "a.py" rein schreiben. Meistens zumindest...

Ich kenne dein Vorhaben nicht und kann deshalb auch keinen besseren Weg vorschlagen.
Ich glaube, dass du einfach auf "try" und "except" verzichten solltest. Es sieht nicht so aus als ob du es in diesem Fall brauchst.
mfg
Gerold

Verfasst: Freitag 14. September 2007, 11:46
von Zap
Hi Twilo wenn ich dich richtig verstanden habe dann
hast du das Problem das nur die Spitze des Exception-Eisbergs anguckst. Man kann mit tb_next noch weiter einsteigen.
Etwas unsinnige Ausgabe aber so kann man sich da durch hangeln
Code: Alles auswählen
def test():
f = file("mich_gibt_es_nicht.txt")
try:
test()
except Exception, inst:
import traceback, sys
exc_tb = sys.exc_traceback
while exc_tb:
tb = traceback.format_tb(exc_tb)
print "-"*80
print "Fehler: %s" % inst
print "Startmodul: %s" % sys.argv[0].strip()
print "Zeilennummer: %s" % traceback.tb_lineno(exc_tb)
print "Dateiname: %s" % tb[0].split(",")[0].strip()[6:-1]
print "-"*80
exc_tb = exc_tb.tb_next
Verfasst: Freitag 14. September 2007, 11:58
von Twilo
Hallo,
ich hab es erst einmal so gelöst:
Code: Alles auswählen
print 'Zeilennummer: %s' % tb[-1].split(', ')[1].strip()[5:]
print 'Dateiname: %s' % tb[-1].split(', ')[0].strip()[6:-1]
somit erhalte ich die Zeilenummer+Dateiname, wo der Fehler auftritt
mfg
Twilo