3

終了したいループがありますKeyboardInterrupt

while True:
    try:
        do_stuff()
    except KeyboardInterrupt:
        cleanup()
        break
    except Exception as e:
        cleanup()
        raise e

これは正常に動作しますが、デュアルcleanup()は私には非常に汚れているようです。重複したコードは好きではありません。代わりにコンテキスト マネージャーを使用してみましたが、不要な複雑さが生じ、ファイル サイズがほぼ 2 倍になりました。

私の意図を表現するよりクリーンな方法はありますか?

4

3 に答える 3

5

BaseException両方をキャッチするために使用できます

try:
   do_stuff():
except BaseException as e:
    cleanup()
    if isinstance(e, KeyboardInterruption):
        break
    raise e

raiseまた、代わりにのみ使用できますraise e

于 2012-11-28T11:39:07.160 に答える
5

finallyキーワードはまさにあなたが探しているものです。エラーと例外に関するドキュメントで、その使用法が説明されています。

例外が発生したかどうかに関係なく、try ステートメントを終了する前に、finally 句が常に実行されます。


クリーンアップがループを離れるときにのみ発生することになっている場合は、ループと try を交換することをお勧めします。

try:
    while True:
        do_stuff()
except KeyboardInterrupt:
    pass
finally:
    cleanup()
于 2012-11-28T11:39:08.130 に答える
1

finally句が必要なように聞こえます:

while True:
  try:
    do_stuff()
  except KeyboardInterrupt:
    break
  finally:
    cleanup()

cleanup()例外が発生またはキャッチされたかどうかにかかわらず、常に呼び出されます。

于 2012-11-28T11:39:34.590 に答える