Seite 1 von 1

print AktuelleZeilenNummer ???

Verfasst: Sonntag 8. August 2004, 16:40
von genrich
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

Verfasst: Sonntag 8. August 2004, 17:26
von genrich
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'

Verfasst: Sonntag 8. August 2004, 19:14
von Dookie
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

Verfasst: Sonntag 8. August 2004, 19:42
von Gast
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

Verfasst: Sonntag 8. August 2004, 19:44
von genrich
(Ups, da war ich wohl nicht eingeloggt...)

"Startmodul" und "Dateiname" ist natürlich jetzt Humbug...

Verfasst: Sonntag 8. August 2004, 19:48
von Dookie

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

Verfasst: Sonntag 8. August 2004, 20:15
von genrich
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]

Verfasst: Sonntag 8. August 2004, 21:59
von RainBowBender