基礎・上級問題チェック

問題 28 /40

次のコードを実行した結果として、正しいものはどれか。

try:
    raise NameError('未定義')
except NameError:
    print('例外発生')
    raise

print('処理継続')

選択 1

例外発生
処理継続

選択 2

例外発生
未定義
処理継続

選択 3

「例外発生」とプリントされた後、プログラムが終了する。

選択 4

何もプリントされない。

解説

選択肢3が正解です。

raise文は指定の例外を強制的に発生させられます。

また、raise文は例外を再送出できます。

問題文のコードを実行すると、以下のように表示されます。

-----------------------------------
例外発生
TraceBack (most recent call last):
   File "(ファイルのパス)",line 2, in <module>
    raise NameError('未定義')
NameError:未定義
-----------------------------------

try節でNameErrorを発生させ、except節で補足して「例外発生」を出力した後、5行目のraiseで例外を再送出しています。

except節で発生した例外は処理されないため、プログラムが終了します。

例外が送出されたことを記録して、後続の処理を止めたい場合は、問題文のように5行目のraiseで例外を再送出します。

なお、5行目の「raise」がなかった場合は、「例外発生」と表示された後、処理は止まらずに下のprint文に進み、「処理継続」と表示されます。

(公式書籍 p.90)