Instabiler Code in Iron Python

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
cecile
User
Beiträge: 18
Registriert: Dienstag 24. August 2010, 12:20

Montag 5. März 2012, 18:06

Untenstehender Code stürzt unregelmässig ab (Ich verwende Iron Python (Vorgabe des Arbeitgebers)), aber immer zwischen "print 4" und "print 5" mit folgender Fehlermeldung:
"SystemError: Object reference not set to an instance of an object."

Code: Alles auswählen

print fnamepart2
        found=False
        for cf in range(len(Calfiles)): 
            print Calfiles[cf,3]
            print 1
            print 2
            print fnamepart2
            print 3
            print Calfiles[cf,3]
            print 4
            if fnamepart2==Calfiles[cf,3]:  # not working
                print 5
                self.CommSystem=Calfiles[cf,1]
                self.UID=Calfiles[cf,0]
                self.AnritsuFile=Calfiles[cf,2]
                found=True
                print self.AnritsuFile
                break

Meine Frage dazu: Wie macht das überhaupt Sinn? Wie kann in "if fnamepart2==Calfiles[cf,3]: " plötzlich ein Objekt nicht gesetzt sein wenn es eine Zeile vorher noch möglich war genau dieses zu printen?
Ich hätte eigentlich gedacht, dass das auch total unahängig davon sein sollte was in den beiden Objekten die verglichen werden steht. (Kann mich dazu vielleicht mal jemand aufklären?)

Es gibt ja durchaus eine einfache Möglichkeit das Problem zu umgehen (siehe unten):
Mit dieser Variante läuft der Code immer durch und ich habe bei mehr als 20 Versuchen noch nie einen Counter>1 gesehen, aber ich würde doch schon gerne verstehen was da los ist, und wie ich das Problem sauber lösen kann.

Code: Alles auswählen

      counter=0
        for cf in range(len(Calfiles)): 
            print Calfiles[cf,3]
            done=False
            counter=0
            while done==False:
                try:
                    print 1
                    counter=counter+1
                    print 2
                    print fnamepart2
                    print 3
                    print Calfiles[cf,3]
                    print 4
                    if fnamepart2==Calfiles[cf,3]:  # not working
                        print 5
                        self.CommSystem=Calfiles[cf,1]
                        self.UID=Calfiles[cf,0]
                        self.AnritsuFile=Calfiles[cf,2]
                        found=True
                        print self.AnritsuFile
                        break
                    done=True
                except:
                    print "counter", counter
                    if counter >10:
                        raise errorhandler(27)
Gruss und Danke
Cecile
BlackJack

Montag 5. März 2012, 18:14

Schau mal was ein `SystemError` ist:

Code: Alles auswählen

In [183]: SystemError?
Type:           type
Base Class:     <type 'type'>
String Form:    <type 'exceptions.SystemError'>
Namespace:      Python builtin
Docstring:
    Internal error in the Python interpreter.                                   
    
    Please report this to the Python maintainer, along with the traceback,
    the Python version, and the hardware/OS platform and version.
Da macht es wenig Sinn nach dem Grund im Python-Code zu suchen, oder ob das überhaupt sein kann. Wenn diese Ausnahme auftritt, dann *ist* es offenbar so wie es ist, aber es sollte ganz sicher nicht so sein.

Das müsstest Du also mit den Entwicklern von IronPython klären.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Dienstag 6. März 2012, 12:46

Ich könnte mir vorstellen, dass der Fehler auftritt, weil IronPython zwei Objekte mit der .NET-Methode Equals() vergleichen will, aber in dem Array da nur "null" aka "None" vorfindet und damit nicht klar kommt. Denn die Fehlermeldung schlägt ja offenbar aus .NET durch und ist dort eine NullReferenceException.

Das sagt mir jedenfalls Google - nicht das ich viel von .NET verstünde.

Ich würde jedoch vermuten, dass die Exception nicht durchschlagen soll und daher ein IronPython-Fehler ist. Siehe auch http://python.6.n6.nabble.com/IronPytho ... 00611.html

Stefan
cecile
User
Beiträge: 18
Registriert: Dienstag 24. August 2010, 12:20

Dienstag 6. März 2012, 15:22

Danke für die Antworten.
Ich habe die Lösung soeben gefunden.
Der Grund scheint zu sein das Calfiles eine liste von numpy S60 strings ist (ausgelesen aus einer Excel datei), fnamepart2 mit dem das ganze verglichen wird ist vom type str().
In 9 von 10 Fällen scheint der Vergleich trotzdem zu klappen, aber eben nicht immer.
Jedenfalls wenn ich das ganze folgendermassen schreibe:

Code: Alles auswählen

if str(fnamepart2)==str(Calfiles[cf,3])
klappts in 100% von den Fällen und nicht nur in 90%.
Antworten