例外処理の仕組みまとめ
8.3 例外処理の仕組みまとめ
ここまで例外処理の基本的な使い方の学習を行いました。本節ではこれまで学習してきた例外処理の仕組みについて再確認していきます。
8.3.1 例外クラスの種類について
数種類だけ例外クラスについて扱ってきましたが、Pythonでは多数の組み込みの例外クラスが用意されております。
また例外クラスは階層関係に分かれており、基底の例外クラスと基底の例外クラスから派生している例外クラスがあります。
例外クラスについて代表的なものを以下でまとめました。
組み込みの例外クラスについて、詳しく知りたい方は、以下のページを参考にしてください。
参考:「組み込み例外(https://docs.python.org/ja/3/library/exceptions.html)」
8.3.2 例外処理を行った場合と行っていない場合の比較(例外処理のメリット)
繰り返し説明になってしまいますが、例外(exception)とは、本来ならばプログラム中では起こってはいけないエラー(想定外のエラー)が起こってしまうことをいいます。
堅牢なプログラムを作成するためには、例外が起こった時でもプログラムが異常な動作をしないようにしっかりと例外処理(exception handling)を行う必要があります。
例外処理を行うことで、以下のようなメリットがあります。
- プログラムの異常終了を防ぐことが可能になる。
- 1箇所に例外に対する処理をまとめることが可能になる。
どのような例外が発生するか事前に分かっていれば、エラー処理の方法としてif文が直ぐに思いつくと思います。しかし、if文で処理を行う場合には、例外が起こりそうな箇所に何度も記述する必要があり、プログラムも煩雑となりとても大変です。
そこで例外処理の出番となります。例外処理を使うことで例外に対する処理を一元管理できるようになります。また、例外を処理した場合には、プログラムを中断せずに処理を先に進めたり、どこでどのような異常が発生したのか情報を通知してからプログラムを中断することも可能になります。
例外処理のネスト(tryブロックの中に別のtryブロック)
これまで学習してきたのと同じように、「ifブロック内に別のifブロック」、「forブロックの中に別のforブロック」といったように例外処理の「tryブロック内に別のtryブロック」を記述することも可能です。
あまりネストし過ぎるとプログラムが煩雑になり、分かりにくくなりますので注意しましょう。
8.3.3 例外処理の基本(try-except-finally)
例外処理を行う時の記述方法はtry-except-finallyが基本的な構文です。例外処理で使われる用語と共に復習します。
・「例外をスロー(throw)する」
プログラム実行中にエラーが発生することを「例外をスロー(throw)する」と言います。
正確にはエラーが発生する際に、例外インスタンスというエラー情報を保有したインスタンスを生成し、そのインスタンスをPython実行プログラムに渡すことをいいます。
・「例外をキャッチ(except)する」
exceptステートメントのパラメータと発生した例外インスタンスが一致することを「例外をキャッチする」といいます。例外をキャッチするとexceptブロック内の処理を実行します。
図 8.3 1: try~except~finally基本構文
try
tryステートメントは例外の発生が予測される処理ブロックです。
except
tryステートメントの次にいくつかの exceptステートメントを続けて記述します。
exceptステートメントは複数記述することが可能で、引数に例外インスタンス(エラー名)を指定します。
finally
exceptブロックが終了した時点でこのfinallyブロックが実行されます。
tryブロックや、exceptブロックに return ステートメントが記述されていても、この finallyブロックは必ず実行されます。