2010-11-24 6 views
2

in der folgenden Funktion, was macht try: früh verlassen? Wenn ich den gleichen Code außerhalb eines def Blocks setze, funktioniert es gut.was macht versuchen: früh verlassen?

tiles = ['095D', '094M'] 
in_file = 'in_file' 
out_file = 'out_file' 
expression = ''' "FIELDNAME" LIKE 'STUFF' ''' 

def foobar(in_file, out_file, expression): 
    print in_file, out_file, expression 
    try: 
     print 'this is trying' 
     #pretty print tile list, from http://stackoverflow.com/questions/2399112/python-print-delimited-list 
     tiles = ','.join(map(str,tiles)) 
     print 'made it past tiles!' 
     print 'From %s \nselecting %s \ninto %s' % (in_file, tiles, out_file) 

    except: 
     print 'Made it to the except block!' 

foobar(in_file, out_file, expression) 

Ergebnisse:

D:\> python xx-debug.py 
in_file out_file "FIELDNAME" LIKE 'STUFF' 
this is trying 
Made it to the except block! 

Ergebnisse mit den same code not in a def:

this is trying 
made it past tiles! 
From in_file 
selecting 095D,094M 
into out_file 
+0

einfach dort, Anfänger werden solche Dinge tun. –

+3

@aaronasterling "Pokemon Exception Handling - Ich muss sie alle fangen!" –

+2

Sie sollten nicht 'außer:' ohne Angabe einer Ausnahme. Das fängt auch Dinge wie KeyboardInterrupt ein, die fast nie das sind, was Sie wollen. – ThiefMaster

Antwort

3

Der Grund, warum es nicht funktioniert, ist, weil Sie tiles im globalen Bereich definiert haben. In der Funktion, die Sie tiles zuweisen. Dies macht tiles einen lokalen Bereichsnamen in der Funktion. Dies bedeutet wiederum, dass der Code in der Funktion überhaupt nicht nach tiles im globalen Gültigkeitsbereich sucht.

In der Aufgabenstellung, Sie versuchen zu tiles (dies ist, bevor es lokal zugewiesen wurde.) Das in einer Ausnahme führt angehoben werden, da Sie eine nicht zugewiesene lokale Variable zuzugreifen versucht.

Die schnelle Lösung ist global zu verwenden:

... 
def foobar(in_file, out_file, expression): 
    global tiles 
    ... 

Wie bereits gesagt, nicht einfach Ausnahmen fangen, ohne etwas mit ihnen zu tun. Wenn Sie Code debuggen wollen, müssen Sie Ausnahmen auslösen, damit Sie die Ursache finden und beheben können! Entweder entfernen Sie die try ... except, oder machen die except eine Ausnahme nehmen und nützliche Informationen über sie drucken, wie folgt aus:

try: 
    ... 
except Exception, e: 
    print 'Oh noes!', e 

Dies kann viel zu lesen, aber Sie werden Python verstehen viel besser, wenn Sie es tun lesen:

http://docs.python.org/reference/executionmodel.html

es wird erklärt, wie Python Variablendefinitionen in dem Modulumfang und Funktionsumfang Griffe, etc. es Ausnahmen auch abdeckt.

+0

Der echte Ausnahmeblock ist 'außer: \ n \ tprint gp.GetMessages() \ n' [(ref)] (http://webhelp.esri.com/arcgiSDEsztop/9.3/body.cfm?tocVisable=1&ID=924&TopicName = Error% 20handling% 20with% 20Python) Ich habe es beim Erstellen einer möglichst einfachen Reproduktion des Fehlers herausgenommen. Danke, dass du mich darüber informiert hast, was vor sich geht. –

-1

Das ist ein interessanter Fehler sind Sie haben. So gibt es ein Modul-Bereich tiles außerhalb der Funktion, und da Sie nicht global verwenden, erstellen Sie eine neue tiles Variable innerhalb der Funktion. Das ist in Ordnung. Oder es wäre in Ordnung, außer dass es erscheint (wenn ich in interaktivem Python herumkomme), dass der Wert der Anweisung (der tiles auf der linken Seite) lokal ist, macht die gesamte Aussage, dass jeder Verweis auf Kacheln den lokalen meint. In diesem Kartenkonstrukt wird also anstelle des Moduls tites das lokale verwendet, außer dass das lokale noch nicht existiert.

Dies könnte ein Fehler in Python sein, aber wahrscheinlich ist es wie vorgesehen.

+1

Kein Fehler, es ist in der Tat sehr gut definiert. Es gibt einen Unterschied zwischen globalen und lokalen Variablen. In Fällen wie diesen haben Sie das Schlüsselwort 'global'. :) – Blixt

+0

Richtig, aber Sie würden denken, es würde zuerst die rechte Seite auswerten, indem Sie (soweit es an diesem Punkt bekannt ist) den globalen Gültigkeitsbereich verwenden, dann eine lokale Variable erstellen und dieser zuweisen. Es scheint, dass Python voraus scannt, um zu sehen, ob jemals eine lokale Variable mit diesem Namen erstellt wurde. – jpsimons

3

Ausnahme Ausgang:

Traceback (most recent call last): 
    File "sof.py", line 19, in <module> 
    foobar(in_file, out_file, expression) 
    File "sof.py", line 11, in foobar 
    tiles = ','.join(map(str,tiles)) 
UnboundLocalError: local variable 'tiles' referenced before assignment 

Nun geschieht dies, weil Fliesen tatsächlich in dem globalen Raum definiert sind.Also, Ihre Funktion sollte so aussehen:

def foobar(in_file, out_file, expression): 
    global tiles 
    ... 
+2

Sie sollten wahrscheinlich erklären, dass dies passiert, weil 'Kacheln' lokal in der Funktion definiert sind, was bedeutet, dass jede globale Variable ignoriert wird, wenn Sie nicht das Schlüsselwort' global' verwenden. Dieser Fehler tritt auch dann auf, wenn Sie Kacheln nicht global definiert haben. – Blixt

+0

Wie haben Sie diese UnboundLocalError-Nachricht erhalten? Alles, was ich bekomme, ist Stille. –

+0

'except' schluckt die Ausnahme. Ohne 'except' würden Sie diesen Fehler erhalten. – Blixt