3

Python 2.6.5 (r265:79063、2012 年 10 月 1 日、22:07:21)

私はこれを持っています:

def f():
    try:
        print "a"
        return
    except:
        print "b"
    else:
        print "c"
    finally:
        print "d"
f()

これは与える:

a
d 

そして期待されていない

a 
c 
d 

リターンをコメントアウトすると、取得されます

a 
c 
d 

Python でこの動作を覚えるにはどうすればよいですか?

4

6 に答える 6

7

疑問がある場合は、ドキュメントを参照してください。

オプションの句は、制御が句elseの末尾から流れた場合に実行されますtry

return現在、制御は、例外または、continue、またはbreakステートメントの実行の場合を除いて、「最後から流れていきます」 。

ブロックreturnの本体から ing しているため、は実行されません。tryelse

于 2013-08-01T00:27:48.090 に答える
2

finallyVM の壊滅的な障害を除いて、ブロックは常に発生します。これは の契約の一部ですfinally

これが何をするかを覚えておくことで、これを思い出すことができますfinally。if/elif/else/while/for/ternary/whatever ステートメントなどの他の制御構造と混同しないでください。これらにはこのコントラクトがないためです。 finallyします。

于 2013-08-01T00:34:24.180 に答える
1

try ブロックに接続されたelseブロックは、例外メカニズムに関して特別なものではありません。try ブロックの後に関数本体にコードを挿入するのと似ています。唯一の機能は、try ブロックと finally ブロックの間で「通常の」コードを実行できることです。ただし、これは、else ブロックに到達する前に関数が戻ると、実行されないことを意味します。

于 2013-08-01T00:26:08.537 に答える
1

Python のドキュメントを見てみましょう。

これを例外処理に使用する場合は、このページをブックマークしてください。

http://docs.python.org/2/tutorial/errors.html

于 2013-08-01T00:27:18.537 に答える
0

, orステートメントが…<code>finally ステートメントのスイートで実行されるとreturn、句も「途中で」実行されます。文節でのステートメントは違法です。(理由は、現在の実装の問題です — この制限は将来解除される可能性があります)。breakcontinuetrytryfinallycontinuefinally

これは実際にはドキュメントからのものです。

于 2018-01-06T15:04:37.513 に答える