Python
 Computer >> コンピューター >  >> プログラミング >> Python

【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

コードの動作解説

処理の流れを順番に見ていきましょう。

  1. 内側のtryブロックで 1/0 を実行し、ZeroDivisionError が発生します。
  2. 内側のexcept句は ArithmeticError を捕捉しますが、エラーメッセージが「Zero division」と一致しないため、else節の raise によって例外がそのまま再送出されます。
  3. 再送出された例外は内側のtryブロックではもう処理されないため、外側のtryブロックへ伝播します。
  4. 外側の except Exception as err: がこの例外を捕捉し、「thumbs down」を出力します。
  5. 最後に raise err で例外を再度投げているため、トレースバックが出力されプログラムが終了します。

ポイントまとめ

  • Pythonの公式チュートリアルにも記載されているとおり、1つのtry文で捕捉できる例外は必ず1つだけです。
  • except句内で raise(引数なし)と書くと、捕捉した例外をそのまま再送出できます。
  • 例外を多段階でハンドリングしたい場合は、ネストしたtryブロックか、関数を分けて呼び出し元で捕捉する設計が有効です。
  1. 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

  2. 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