1行で複数の例外をキャッチするにはどうすればよいですか(ブロックを除く)
これを行う:
try:
may_raise_specific_errors():
except (SpecificErrorOne, SpecificErrorTwo) as error:
handle(error) # might log or have some other default behavior...
括弧は、コンマを使用してエラーオブジェクトを名前に割り当てる古い構文のために必要です。as
キーワードは、割り当てに使用されます。エラーオブジェクトには任意の名前を使用できますが、error
個人的に好みます。
ベストプラクティス
現在、Pythonと互換性のある方法でこれを行うには、例外をコンマで区切り、括弧で囲むことで、例外タイプをたどることで例外インスタンスを変数名に割り当てた以前の構文と区別し、コンマ。
簡単な使用例を次に示します。
import sys
try:
mainstuff()
except (KeyboardInterrupt, EOFError): # the parens are necessary
sys.exit(0)
バグの非表示を回避するために、これらの例外のみを指定しています。バグが発生した場合は、完全なスタックトレースを期待しています。
これはここに文書化されています:https : //docs.python.org/tutorial/errors.html
例外を変数に割り当てることができます(e
一般的ですが、長い例外処理がある場合、またはIDEが私のようにそれよりも大きい選択のみをハイライトする場合は、より詳細な変数を使用することをお勧めします。)インスタンスにはargs属性があります。次に例を示します。
import sys
try:
mainstuff()
except (KeyboardInterrupt, EOFError) as err:
print(err)
print(err.args)
sys.exit(0)
Python 3ではerr
、except
ブロックが終了するとオブジェクトがスコープ外になることに注意してください。
非推奨
エラーをコンマで割り当てるコードが表示される場合があります。この使用法は、Python 2.5以前で使用できる唯一の形式であり、廃止予定です。コードをPython 3で上位互換にしたい場合は、新しい形式を使用するように構文を更新する必要があります。
import sys
try:
mainstuff()
except (KeyboardInterrupt, EOFError), err: # don't do this in Python 2.6+
print err
print err.args
sys.exit(0)
コードベースにコンマ名の割り当てがあり、Python 2.5以降を使用している場合は、新しい方法に切り替えて、アップグレード時にコードの互換性を維持します。
suppress
コンテキストマネージャ
受け入れられた答えは、実際には最低4行のコードです。
try:
do_something()
except (IDontLikeYouException, YouAreBeingMeanException) as e:
pass
try
、except
、pass
ラインが有する一列に取り扱うことができるのPython 3.4で利用できる抑制コンテキストマネージャ、:
from contextlib import suppress
with suppress(IDontLikeYouException, YouAreBeingMeanException):
do_something()
したがって、pass
特定の例外については、を使用してくださいsuppress
。