【Python】tryブロック内のexcept節から例外を再送出し、外側のexceptブロックで捕捉する方法
はじめに:1つのtryブロックで実行されるexcept句は「1つだけ」
Pythonでは、1つのtryブロックに対して実際に実行されるexcept句は常に1つだけです。最初のexcept句がマッチして処理を実行すると、そのtry文自体の処理は完了し、同じtryブロック内の他のexcept句が再度評価されることはありません。
そのため、「except句の中でraiseした例外を、同じ階層の別のexcept句で捕捉する」ことはできません。例外をより上位の階層(外側)で捕捉したい場合は、ネストされた(入れ子構造の)tryブロックを使う必要があります。
ネストしたtry...exceptブロックのサンプルコード
以下のように、2つのtry...exceptブロックを入れ子にしてみましょう。内側のexcept句で条件に合わない例外をそのままraiseし直すことで、外側のexcept句で捕捉できる仕組みです。
try:
try:
1/0
except ArithmeticError as e:
if str(e) == "Zero division":
print("thumbs up")
else:
raise
except Exception as err:
print("thumbs down")
raise err実行結果
このコードを実行すると、以下のような出力が得られます。
thumbs down Traceback (most recent call last): File "C:/Users/TutorialsPoint1/~.py", line 11, in <module> raise err File "C:/Users/TutorialsPoint1/~.py", line 3, in <module> 1/0 ZeroDivisionError: division by zero
コードの動作解説
処理の流れを順番に見ていきましょう。
- 内側のtryブロックで
1/0を実行し、ZeroDivisionErrorが発生します。 - 内側のexcept句は
ArithmeticErrorを捕捉しますが、エラーメッセージが「Zero division」と一致しないため、else節のraiseによって例外がそのまま再送出されます。 - 再送出された例外は内側のtryブロックではもう処理されないため、外側のtryブロックへ伝播します。
- 外側の
except Exception as err:がこの例外を捕捉し、「thumbs down」を出力します。 - 最後に
raise errで例外を再度投げているため、トレースバックが出力されプログラムが終了します。
ポイントまとめ
- Pythonの公式チュートリアルにも記載されているとおり、1つのtry文で捕捉できる例外は必ず1つだけです。
- except句内で
raise(引数なし)と書くと、捕捉した例外をそのまま再送出できます。 - 例外を多段階でハンドリングしたい場合は、ネストしたtryブロックか、関数を分けて呼び出し元で捕捉する設計が有効です。
-
Pythonのtry・except・finally文を解説!例外処理の基本と使い方
Pythonにおける例外処理では、try文とexcept文を使って、発生した例外(エラー)を捕捉し、適切に処理することができます。try節の中のコードは、上から順に1文ずつ実行されます。もし実行中に例外が発生すると、その時点でtryブロック内の残りの処理はスキップされ、代わりにexcept節が実行されます。基本的な例try: apple + 6except Exception: print(Cannot concatenate str and int objects)出力結果Cannot concatenate str and int objectsこのように、try〜except
-
Pythonで例外を無視して処理を続行する方法【try-exceptの正しい使い方】
例外を無視してプログラムを続行させる基本の書き方Pythonでは、try-exceptブロックとpass文を組み合わせることで、発生した例外を捕捉しながら、あえて何も処理せずにプログラムを続行できます。主な書き方は以下の2通りです。方法1:bare except(裸のexcept)を使うtry: 1/0except: pass方法2:except Exception を使うtry: 1/0except Exception: passどちらの場合も、pass文が「例外が発生しても何もしない」という役割を果たし、プログラムはそのまま次の処理へ進みます。bare except