bei einer Exception die Zeile ermitteln

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
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Hallo,

wie kann ich die Zeile ermitteln, in welcher die Exception ausgelöst wurde?

Code: Alles auswählen

except Exception, e:
    print e
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
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo Twilo!

Hier hast du ein Beispiel:
http://www.python-forum.de/post-47195.html#47195

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Hallo,
gerold hat geschrieben:Hier hast du ein Beispiel:
http://www.python-forum.de/post-47195.html#47195
danke :)

das wäre doch sicherlich etwas für das Tutorial :wink:

mfg
Twilo
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

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
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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... :roll: 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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

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
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Antworten