プログラムの実行中に予期せぬ問題が発生すると、Pythonは「例外 (exception)」を送出して処理を中断します。これらのエラーを放置するとプログラムはクラッシュしてしまいますが、「例外処理」の仕組みを使うことで、エラーを優雅に捉えて対処できます。この章では、その方法を学びます。
他の言語の try...catch
と同様に、Pythonでは try...except
ブロックを使います。エラーが発生する可能性のあるコードを try
ブロックに記述し、エラーが発生した際の処理を except
ブロックに記述します。
例えば、0
で割り算をすると ZeroDivisionError
という例外が発生します。
このエラーを try...except
で捕捉してみましょう。
try
ブロック内で ZeroDivisionError
が発生したため、プログラムはクラッシュせずに except
ブロック内の処理が実行されました。
try
ブロック内では、複数の種類のエラーが発生する可能性があります。例えば、ユーザーの入力を数値に変換しようとして失敗した場合は ValueError
が発生します。
複数の例外を処理するには、2つの方法があります。
1. except
ブロックを複数記述する
エラーの種類ごとに異なる処理を行いたい場合に適しています。
2. 1つの except
ブロックでタプルを使ってまとめる
複数の例外に対して同じ処理を行いたい場合に便利です。
as e
のように書くことで、発生した例外オブジェクトそのものを変数 e
で受け取ることができます。これにより、具体的なエラーメッセージを表示できます。
特定の条件を満たした場合に、意図的に例外を発生させたいことがあります。その場合は raise
文を使います。
例えば、負の値を受け付けない関数を考えてみましょう。
このように、raise
を使うことで、関数の事前条件などを満たさない場合に、プログラムの実行を中断して呼び出し元にエラーを通知できます。
try...except
ブロックには、else
と finally
という2つのオプションの節を追加できます。
else
節: try
ブロックで例外が発生しなかった場合にのみ実行されます。finally
節: 例外の有無に関わらず、必ず最後に実行されます。ファイルクローズやデータベース接続の切断など、後片付け処理に最適です。すべての節を使った例を見てみましょう。
この例から、実行フローが明確にわかります。
try
-> else
-> finally
の順に実行されます。try
-> except
-> finally
の順に実行されます。finally
節は、try
ブロック内で return
が実行される場合でも、その return
の直前に実行されることが保証されています。これにより、リソースの解放漏れなどを防ぐことができます。
この章では、Pythonにおけるエラー処理の基本を学びました。重要なポイントを振り返りましょう。
try...except
: 例外が発生する可能性のあるコードを try
ブロックで囲み、except
ブロックで捕捉することで、プログラムのクラッシュを防ぎ、エラーに応じた処理を実行できます。except
ブロックを複数記述したり、タプルでまとめたりすることで、さまざまな種類のエラーに柔軟に対応できます。raise
: 特定の条件で意図的に例外を発生させ、プログラムに異常な状態を通知します。else
と finally
: try
ブロックが成功した場合の処理を else
に、成功・失敗にかかわらず必ず実行したい後片付け処理を finally
に記述することで、より堅牢なコードを書くことができます。例外処理をマスターすることは、予期せぬ入力や状況に強い、安定したプログラムを作成するための重要なステップです。
リストとインデックスを受け取り、そのインデックスに対応する要素を返す safe_get(my_list, index)
という関数を作成してください。
要件:
IndexError
)、「指定されたインデックスは範囲外です。」と表示してください。TypeError
)、「インデックスは整数で指定してください。」と表示してください。python practice8_1.py
ユーザーの年齢を入力として受け取り、18歳以上であれば「あなたは成人です。」と表示する check_age(age_str)
という関数を作成してください。
要件:
ValueError
) は、ValueError
を raise
して、「有効な数値を入力してください。」というメッセージを伝えてください。ValueError
を raise
して、「年齢に負の値は指定できません。」というメッセージを伝えてください。raise
された例外も捕捉できるようにしてください。python practice8_2.py