2010-11-24 1 views
2

以下の機能では、try:を早期に終了するものは何ですか?同じコードをdefブロックの外に置くと正常に動作します。何をしようとしていますか?

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) 

結果:same code not in a def

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

結果:

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

がありますので、初心者はそんなことをします。 –

+3

@aaronasterling "ポケモンの例外処理 - すべてをキャッチ!" –

+2

例外を指定せずに 'except:'するべきではありません。それはまた、ほとんどあなたが望むものではないKeyboardInterruptのようなものをキャッチします。 – ThiefMaster

答えて

3

グローバルスコープにtilesを定義したため、それが機能しない理由があります。あなたはtilesに割り当てられている関数で。これにより、tilesは関数内でローカルスコープの名前になります。これは、関数内のコードがグローバルスコープ内のtilesをまったく検索しないことを意味します。あなたが割り当てられていないローカル変数にアクセスしようとしたので、あなたはにしようとしているの割り当てで

は、(それがローカルに割り当てられている前に、これがある。)tilesを取得これは、提起された例外が発生します。

クイックフィックスはglobalを使用することです。他の人が言ったように、ちょうど彼らと何かをせずに例外をキャッチしない

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

。コードをデバッグするときには、例外をスローして原因を見つけて修正する必要があります。 except ... tryを削除、またはexceptが例外を取ると、それに関する有用な情報を印刷し、このようにする次のいずれかの

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

これは読むことがたくさんかもしれないが、あなたは多くのPythonを理解しますあなたはそれを読んで行う場合は、より良い:

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

それはそれはまた、例外をカバーなど、Pythonはモジュールスコープと関数スコープで変数定義を処理する方法を説明します。

+0

実際の例外ブロックは 'except:\ n \ tprint gp.GetMessages()\ n'(http://webhelp.esri.com/arcgiSDEsktop/9.3/body.cfm?tocVisable=1&ID=924&TopicName)です。 =エラー%20handling%20with%20Python)私は、エラーの可能な限り簡単な再現を構築するときにそれを取り出した。何が起こっているかを私に教えてくれてありがとう。 –

-1

あなたが持っている面白いバグです。したがって、モジュールスコープのtilesが関数の外にあり、globalを使用していないので、関数内に新しいtiles変数を作成しています。これは問題ありません。または、文章の左辺値(ローカルの左側のtiles)がローカルであることが表示されていることを除いて、それは問題ありません。したがって、そのマップ構造では、モジュールtitesを使用する代わりに、ローカルのものを使用しますが、ローカルのものはまだ存在しません。

これはPythonのバグかもしれませんが、おそらくそれは意図したとおりです。

+1

バグではなく、実際には非常に明確です。グローバル変数とローカル変数には違いがあります。これらのような場合には 'global'というキーワードがあります。 :) – Blixt

+0

しかし、グローバルスコープを知っていれば、最初に右側を評価してから、ローカル変数を作成してそれを割り当てると思うでしょう。 Pythonは、その名前のローカル変数が作成されたかどうかを調べます。 – jpsimons

3

例外出力:タイルは実際にグローバル空間で定義されているため

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 

は今、これは起こります。だから、あなたの関数はこのようになるはずです:

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

'tiles'は関数内でローカルに定義されているため、' global'キーワードを使用しない限り、どのグローバル変数も無視されるので、起こっていると説明してください。このエラーは、 'tiles'をグローバルに定義しなくても発生します。 – Blixt

+0

UnboundLocalErrorメッセージはどうやって取得できましたか?私が得るのは沈黙です。 –

+0

例外をスワールします。 'except'がなければ、そのエラーが発生します。 – Blixt

関連する問題