-1

次のコードがあるとします。

try:
    [...]
except:
    raise Exception([...])
finally:
    [code]

私の質問は次のとおりです。tryブロック内のコードが でキャッチされた例外を発生させた場合、句で新しい例外が発生したため、実行されたのはexcept[code]からですか? もしそうなら、それはいつ実行されますか?新しい例外が発生する前ですか、それとも新しい例外がメソッド スタックを介して伝播された後ですか?finallyexcept

4

2 に答える 2

6

例は 1000 語に値します。なぜ、自分が書いたものを試してみなかったのですか?

>>> def foo():
>>>     try:
>>>         print "2 try block"
>>>         raise Exception("1")
>>>         print "never printed"
>>>     except:
>>>         print "3 first except block"
>>>         raise Exception("2")
>>>     finally:
>>>         print "4 finally block"
>>>     print "end of function"
>>>
>>> try:
>>>     print "1 before foo"
>>>     foo()
>>>     print "never printed too"
>>> except:
>>>     print "5 outter except clause"
1 before foo
2 try block
3 first except block
4 finally block
5 outter except clause

新しい例外が発生する前ですか、それとも新しい例外がメソッド スタックを介して伝播された後ですか?

例からわかるように、finally ブロックは、それが定義されている except ブロックの後 (つまり、try/ except/ブロックを離れた後) に呼び出されますが、外側の/ブロックfinallyに到達する前に呼び出されます。tryexcept

これは論理的であり、ブロックを終了するときに常に最終的にトリガーされるtryようにする必要があるため、ステートメントの外でコードを実行するときにコード環境が一貫していることを確認できますtry(リソースを解放するか、リセットするか)値、またはロールバック/変更のコミット...)。

于 2013-06-19T12:21:00.253 に答える
3

try ブロックが成功した場合でも、例外により except ブロックが実行された場合でも、finally が実行されます。

except ブロックが例外を発生させたとしても、新しい例外は別の try catch ハンドラーによって処理されますが、finally ブロックを実行した後、再帰ループを形成するのではなく:

try:
    try:
        [...]
    except:
        raise Exception([...]) #this is line number xyz
    finally:
        [code]
except:
    [...] #this code will be running after line number xyz
于 2013-06-19T12:15:49.243 に答える