286

この質問にはすでに答えがあります。

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

4 답변


445

except:
    pass


  • 例外を除いて、他の例外を飲み込まないように#importantを渡してください。 - Roger Pate
  • @Aaron - 同意しますが、これが良い考えでも悪い考えでも問題はありませんでした - David
  • これはSystemExit、KeyboardInterrupt、そして他にはキャッチしたくないものをキャッチします。 - FogleBird
  • KeyboardInterruptがキャッチされませんでした。例えば:while True: try: f = open(' filedoesnotexist.txt') `except: passKeyboardInterruptはコードを停止して終了します。 - Chthonic Project
  • @ChthonicProject裸exceptKeyboardInterruptを含む、あらゆる例外をキャッチしますが、それが内部で発生した場合のみです。try。この例では、KeyboardInterruptは、tryまたはの中except捕まえられなかった場合、次のような例を実行するとwhile True: try: pass except: passKeyboardInterruptが約50%の確率で検出されていることがわかります。もし、あんたがtime.sleep(1)の中tryあなたはそれがほぼ毎回捕まることに気付くでしょう。 - Jack O'Connor

224

一般的な答え

Pythonの標準の "nop"はpassステートメント:

try:
    do_something()
except Exception:
    pass

を使うexcept Exception裸の代わりにexceptのような例外をキャッチしないでくださいSystemExitKeyboardInterrupt

Python 2

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

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

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

Python 3

Python 3では、例外インスタンスを保持する変数は次のようになります。削除しました終了時にexceptブロック。変数が以前に値を保持していたとしても、exceptブロックになる未定義再び。


  • 「例外を除く:」を使用しているため、これは受け入れられたものよりも優れた回答です。 「除外:」だけでなく、他の人が指摘したように、SystemExitやKeyboardInterruptのようにあなたが捕まえたくない他のものを不適切に飲み込むであろう。 - aculich
  • +1ユニットテストを実行して例外を期待するときに重要なエラーもクリアします - geographika
  • ご了承くださいexc_clearPython 3で削除されました。docs.python.org/3/whatsnew/3.0.html#index-22。 Python 3でこれに対処するいくつかの方法はこちらを参照してください。cosmicpercolator.com/2016/01/13/… - bcattle
  • 見るstackoverflow.com/a/53575187/3140992複数の例外を素早く無視するため - citynorman

133

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に改名されましたsuppress3.4リリースより前


  • 私はこの解決策が好きかどうかよくわかりません...私は、3行を1行に置き換えただけだと思います(try、except、passはすべて1つにまとめられています)。これは、あなたがしてはいけないことを示すための新しいキーワードを導入する方法です。少なくとも例外を記録しておく必要があるようです。 - ArtOfWarfare
  • これはあなたのコードをtry...catch: passそのため、ブロック内で例外が発生した場合は、ブロックの終了後に実行が継続されます。 - Jack O'Connor
  • @ JackO' Connorまあ、それはそれをむしろ役に立たなくします…私はそれが約束されたように例外を単に無視するだろうと思いました。 - Navin
  • @ArtOfWarfare私が言った場合、整数を渡しますが、ときにはシングルトンタプルで渡して、どちらか一方を実行したときには通知しません。今あなたの仕事は常に整数を返すことですか?おそらくあなたは以下のようなものを書くことができることを感謝するでしょうwith suppress(TypeError): return data[0](長い例:pastebin.com/gcvAGqEP) - Air
  • 参考までに、djangoはの使用を元に戻しますwith suppress(Exception)2017-09では、try / exceptのほうがパフォーマンスが良いためです。このコミットを確認する「修正#27818 - try / except / passをcontextlib.suに置き換えました…」 - stackoverYC

13

これを試して:

try:
    blah()
except:
    pass

リンクされた質問


関連する質問

最近の質問