2013-08-22 12 views
8

私はPythonを学んでいて、簡単には消化できないコンセプトを見つけました:構成内のオプションのelseブロック。 the documentationによるとtry/except構文でPythonでelseを使うのはなぜですか?

してみてください... except文は 現在、すべての条項を除いて従う必要があり、オプションのelse節を持っています。 try節が例外を発生させない場合は、 を実行する必要があるコードには便利です。

私はなぜtry節がトライ構造内の例外を上げていない場合に実行されなければならないコードを持っている程度混乱しています - なぜ単にそれは同じで除いて試して/従っていませんインデントレベル?私は例外処理のオプションを単純化すると思います。あるいは、別の方法として、elseブロック内にあるコードは、それが独立したtryステートメントに単純に従っていた場合は実行されません。たぶん私は何かを見逃している、私を教えてください。

この質問は、this oneと多少似ていますが、私が探しているものが見つかりませんでした。

答えて

11

elseブロックは、tryのコードで例外が発生しない場合にのみ実行されます。コードをelseブロックの外に置くと、例外に関係なく起こります。また、それは一般的に重要であるfinallyの前に起こります。

これは一般的に、エラーが発生する可能性のある簡単なセットアップまたは検証セクションと、エラーを非表示にしないように設定したリソースを使用するブロックがある場合に便利です。 tryにコードを入力することはできません。なぜなら、エラーを伝播させたい場合は、except句になる可能性があるからです。セットアップが失敗したか、またはfinallyがすべてダウンしたために、リソースが確実にそこで利用できないため、構造の外に置くことはできません。したがって、ブロックはelseです。

+0

ああ、OK ...完璧な理にかなっています。それでは、tryセクションの最後に置いてみましょう。そのコード自体が例外を投げている可能性があり、例外の起点の範囲を制限したいのですか? – amphibient

+2

はい。他の言語の 'try'に入れるのが普通ですが、特に' except'ブロックがない場合はPythonに 'else'があるので、それを使用します。 – user2357112

+0

優れた解説、ありがとうございます – amphibient

4

例外を発生させたかどうかを確認するフラグ変数をユーザーが定義できないようにすることができます(for-elseループ)。

簡単な例:

lis = range(100) 
ind = 50 
try: 
    lis[ind] 
except: 
    pass 
else: 
    #Run this statement only if the exception was not raised 
    print "The index was okay:",ind 

ind = 101 

try: 
    lis[ind] 
except: 
    pass 
print "The index was okay:",ind # this gets executes regardless of the exception 

# This one is similar to the first example, but a `flag` variable 
# is required to check whether the exception was raised or not. 

ind = 10 
try: 
    print lis[ind] 
    flag = True 
except: 
    pass 

if flag: 
    print "The index was okay:",ind 

が出力:

The index was okay: 50 
The index was okay: 101 
The index was okay: 10 
関連する問題