print AktuelleZeilenNummer ???

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
genrich
User
Beiträge: 91
Registriert: Sonntag 27. Juni 2004, 17:46

Sonntag 8. August 2004, 16:40

Aus dem Posting kann man lesen, wie man mit traceback an die aktuelle Zeilennummer ran kommt:
http://python.sandtner.org/viewtopic.php?p=8616#8616

Allerdings funktioniert das doch nur bei einem except.
Wie komme ich an die aktuelle Zeilennummer, einfach so?

z.B.

Code: Alles auswählen

print lineno
genrich
User
Beiträge: 91
Registriert: Sonntag 27. Juni 2004, 17:46

Sonntag 8. August 2004, 17:26

Ich glaube ich schreibe mit lieber eine eingene Fehlermeldung... Das wollte ich im Prinzip eh machen :)

Aber so richtig funktioniert das nicht:

Code: Alles auswählen

class Fehler(Exception):
    def __init__(self):
        import traceback, sys

        tb = traceback.format_tb(sys.last_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
        sys.exit()


raise Fehler
Ich erhalte den Fehler:

Code: Alles auswählen

tb = traceback.format_tb(sys.last_traceback)
AttributeError: 'module' object has no attribute 'last_traceback'
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Sonntag 8. August 2004, 19:14

Hi genrich,

last_traceback ist nicht immer verfügbar, nimm besser sys.exc_info().
Aber eigentlich ist das ganze so eh etwas vermurkst.
Schau besser mal ins Pythontutorial: http://www.python.org/doc/current/tut/n ... 0000000000

hier noch wie es gehen könnte:

Code: Alles auswählen

import sys, traceback

class Fehler(Exception):
    
    def __init__(self, value):
        self.value = value
        exc = traceback.extract_stack()
        print "-"*80
        print "Fehler:         %s" % exc[0][3]
        print "Startmodul:     %s" % sys.argv[0].strip()
        print "Zeilennummer:   %s" % exc[0][1]
        print "Dateiname:      %s" % exc[0][0]
        print "-"*80
        sys.exit()
        
    def __str__(self):
        return repr(self.value)


raise Fehler, "uups"

Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Gast

Sonntag 8. August 2004, 19:42

Wie immer bist du meine Rettung....

Ich hab's noch ein bischen gekürzt...
Ein Zusätzlichen FehlerText (also raise Fehler,"FehlerText") benötige ich nicht, ansonsten ist es das selbe Ergebniss:

Code: Alles auswählen

import sys,traceback

class Fehler:
    def __init__(self):
        exc = traceback.extract_stack()
        print "-"*80
        print "Fehler:         %s" % exc[0][3]
        print "Startmodul:     %s" % __file__
        print "Zeilennummer:   %s" % exc[0][1]
        print "Dateiname:      %s" % exc[0][0]
        print "-"*80
        sys.exit()


raise Fehler
genrich
User
Beiträge: 91
Registriert: Sonntag 27. Juni 2004, 17:46

Sonntag 8. August 2004, 19:44

(Ups, da war ich wohl nicht eingeloggt...)

"Startmodul" und "Dateiname" ist natürlich jetzt Humbug...
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Sonntag 8. August 2004, 19:48

Code: Alles auswählen

class Fehler:
    def __init__(self):
        exc = traceback.extract_stack()
        print "-"*80
        print "Fehler:         %s" % exc[-2][3]
        print "Startmodul:     %s" % __file__
        print "Zeilennummer:   %s" % exc[-2][1]
        print "Dateiname:      %s" % exc[-2][0]
        print "-"*80
        sys.exit() 
ist noch etwas besser, dann wird immer der letzte Trace vor dem __init__ ausgegeben.

Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
genrich
User
Beiträge: 91
Registriert: Sonntag 27. Juni 2004, 17:46

Sonntag 8. August 2004, 20:15

Mist, das ist mir gerade auch aufgefallen, aber du warst schneller :)

Allerdings hatte ich eine sehr umständlich Lösung:

Code: Alles auswählen

exc[len(exc)-2][1]
Aber wie du gezeigt hast geht's ja wieder viel einfacher![/python]
RainBowBender
User
Beiträge: 53
Registriert: Dienstag 6. April 2004, 10:33

Sonntag 8. August 2004, 21:59

Antworten