web-dev-qa-db-ja.com

Python:例外を無視して先に進むには?

私は試してみた...私のコードでブロックを除くと例外がスローされたとき。その場合でも、コードを続行したいのですが、それでもすべてを正常に実行できます。問題は、except:blockを空のままにするか#doを何も指定しないと構文エラーになることです。ループに入っていないのでcontinueは使えません。私が使うことのできるキーワードがあり、それはコードにそのまま続けるように伝えますか?

324
The.Anti.9
507
Andy Hume

一般的な答え

Pythonの標準の "nop"はpassステートメントです。

try:
    do_something()
except Exception:
    pass

exceptの代わりにexcept Exceptionを使用すると、SystemExitKeyboardInterruptなどの例外をキャッチできなくなります。

Python 2

Python 2では最後にスローされた例外が記憶されているため、例外をスローするステートメントに含まれるオブジェクトのいくつかは無期限に(実際には、次の例外まで)存続しています。これがあなたにとって重要で、(通常)最後にスローされた例外を覚えておく必要がない場合は、passの代わりに次のようにします。

try:
    do_something()
except Exception:
    sys.exc_clear()

これにより、最後にスローされた例外がクリアされます。

Python 3

Python 3では、exceptブロックを終了すると、例外インスタンスを保持する変数は削除されます。変数が以前に値を保持していたとしても、exceptブロックを出入りした後には、未定義になります。

241
tzot

Python 3.4では、これを行うための新しい方法があります。

from contextlib import suppress

with suppress(Exception):
  # your code

これが追加されたコミットです。 http://hg.python.org/cpython/rev/406b47c64480

そしてここに作者、Raymond Hettingerがあり、これと他のあらゆる種類のPythonの熱さについて話しています(43:30の関連ビット): http://www.youtube.com/watch?v= OSGv2VnC0go

exceptという裸のキーワードをエミュレートし、KeyboardInterruptのようなことを無視したいのであれば(通常はそうではありませんが)、with suppress(BaseException)を使用することができます。

編集:ignoredは3.4リリースの前にsuppressに改名されたようです。

154
Jack O'Connor

これを試して:

try:
    blah()
except:
    pass
14
ryeguy