Skip to content

4.11 エラー処理とtry、except

Pythonでは、エラーが発生したときに実行されるコードを「例外(Exception)」と呼びます。 適切な例外ハンドラを用意せずにエラーが発生すると、Pythonはエラーメッセージを表示してプログラムを強制終了してしまいます。これを防ぎ、状況に応じて穏便に処理を継続させるのが例外処理の役割です。

例外が起きそうな場所を try ブロックで囲み、エラーが起きた時の処理を except ブロックに記述します。

short_list = [1, 2, 3]
position = 5
try:
# エラーが起きる可能性があるコード
short_list[position]
except:
# エラーが起きた時に実行されるコード
print('Need a position between 0 and', len(short_list)-1, 'but got', position)
# 出力: Need a position between 0 and 2 but got 5

引数なしの except はあらゆるエラーをキャッチしてしまいますが、特定の例外型を指定することで、エラーの種類に応じたきめ細やかな処理が可能になります。

short_list = [1, 2, 3]
while True:
value = input('Position [q to quit]? ')
if value == 'q':
break
try:
position = int(value)
print(short_list[position])
except IndexError as err:
# インデックス範囲外のエラーを個別にキャッチ
print('Bad index:', position)
except Exception as other:
# その他のあらゆる例外をキャッチし、詳細を表示
print('Something else broke:', other)

except 例外型 as 変数名 と記述することで、例外オブジェクト自体にアクセスし、システムが生成した詳細なエラーメッセージを取得できます。

  • IndexError: シーケンスに無効な位置を指定したときに発生します。
  • Exception: ほとんどの例外の親クラスであり、予期せぬエラーをまとめて拾うのに役立ちます。

ある関数内で例外が発生し、その関数内でキャッチされなかった場合、その例外は呼び出し元の関数(上位の関数)へと伝わっていきます(バブルアップ)。最終的にどこでもキャッチされなければ、プログラムは終了します。