Pythonでは、ZeroDivisionErrorやIndexErrorなどが発生する場合があります。
エラー発生時にはtry,exceptで例外処理をするのが一般的です。
そこでtry,exceptの正しい使い方や、例外処理の大切さなどを解説しています。
はじめに:Pythonの例外処理とは
最初に例外処理について確認していきましょう。
プログラムが処理を行っている最中に、何かしらの異常が発生したとします。
このときに現在行われている処理を中止し、他の処理を行うことを例外処理と言います。
もし例外処理が発生したら、発生した例外に対する処理が必要です。
その処理に適しているのがPythonの例外処理です。
Python例外処理の基本は、
- try
- except
- finally
この3つのブロックを使用することです。
tryには例外が発生すると思われるコードを記載します。
exceptには例外が発生したときにどう処理するのかを記載します。
finallyにはエラーの発生を抑える実行コードを書きます。
最初にtryとexceptを学習すれば、簡単なPython例外処理が行えます。
例外とは
例外とは、簡単に言えば予期していないエラーのことです。
通常のエラーは、プログラム自体が間違っているときに発生します。これを構文エラーと言います。
しかし、プログラム自体が間違っていないにも関わらず、エラーが発生することもあるのです。
どういったときに例外が発生しやすいのかというと、存在していない属性にアクセスしたときや、定義がなされていない変数を使用したときなどです。
ネットワーク環境によって正しく処理が行えない場合などにも発生します。これを例外というのです。
例外処理の重要性
例外処理には大きく分けて2つの方法があります。
1つは例外そのものを無視すること。
もう1つは発生した例外に対しての対処法を決める方法です。
個人の趣味でプログラムを組んでいるなら、無視をしても特に問題はありません。
しかし、仕事でプログラムを組んでいる場合はそうはいきません。必ず例外処理が必要になります。
なぜ例外処理が必要なのかというと、例外が発生したのに放置しておくと、システム障害が発生する可能性があるからです。
システム障害が発生すれば、重大なトラブルに発展することもあるでしょう。
そこで例外処理を行うことで、品質の向上や安全に稼働ができるように対処するのです。
基本的なtry, exceptの使い方
初めてPythonの例外処理を勉強する人は、まずtry, exceptの使い方から始めるのがよいでしょう。
try, except文には、両方とも役割が存在しています。
では、try節にはどんな役割があるのか、except節にはどういった役割があるのか確認していきましょう。
try節の役割
例外が発生する可能性のあるプログラムを記載し、エラーの内容をユーザーに知らせるのがtry節の役割です。
例えばすでに存在していないファイルをアクセス使用した場合や、0で割るという処理を実行した場合はエラーが発生します。
エラーが発生した場合、ユーザーは何も対処することができないので、対処は開発者側で行わなければいけません。
そこで例外が発生する可能性があるコードをtryに書きこみ、プログラムを実行したときにどのような問題があるのかを知らせる必要があるのです。
tryできちんと例外の指定をしておかないと、例外に対する対処ができなくなります。
except節の役割
except節の役割は、問題が検出された場合に、どのように処理するのかを指定することです。
そのため、try節に発生する可能性があるエラーの内容が記されていないと、処理を実行することができません。
try節とexcept節は、2つで1セットです。どちらが欠けても正しく例外処理ができなくなります。
0で割り算をしたときに発生するエラーに対しては、try節に0除算でエラーが発生する可能性があることを記載します。
これだけではエラーに対する対処法が書かれていないので、ユーザーにエラーを知らせることしかできません。
そこでexcept節を追加し、どのように対処するのかを記載するのです。
例えば0で割ることはできません、例外が発生しましたなどの文面を記載すれば、処理を実行したときに書いたメッセージが表示されます。
エラー時の例外処理の構成
Python例外処理の基本構成は、tryに発生する可能性のあるエラーコードを記載し、exceptにエラーが発生したときの処理方法を書くことです。
まずは基本的な例外処理の構成を把握しておきましょう。
エラーは単体で発生することもあれば、複数発生することもあります。
そこで特定のエラーを補足する方法と、複数エラーが発生した場合の対処法を紹介します。
特定のエラーを捕捉する
特定のエラーを補足する場合は、try,except文を用います。
例えば10/0という計算をさせたとします。この場合、0を用いているのでエラーが発生します。
そこでtry節に0で割ろうとしているので、エラーが発生する可能性があることを記載します。
次にエラーが発生したときの対処法をexcept節に書きこみます。
通常はメッセージを表示させ、エラーが発生したことをユーザーに伝えるのが目的です。
そのため、0で割るのは不可能ですなどというメッセージを出して対処します。
メッセージを表示させるには、except ZeroDivisionError:というプログラムを書きます。
その下にあるprint(“ここに表示したいメッセージを記載”)することで、メッセージが表示されるようになります。
これで特定のエラーを捕捉できます。エラーの内容が異なっていても、同じ方法で対処できます。
複数のエラーを捕捉する
エラーは必ずしも1つだけしか発生しないとは限りません。場合によっては複数発生することがあります。
複数のエラーが発生した場合も、基本的には特定のエラーを補足する場合と同じく、try,except文で複数のエラーに対応できます。
try節には発生する可能性があるエラーを記載しますが、この点は特定のエラーを補足する場合と同じです。
次にexcept節ですが、ここにはエラーをユーザーに伝えるメッセージなどを記入します。
これだけでは特定のエラーを補足することしかできません。
そこでexcept文を複数構成することで、複数のエラーを補足できるようになります。
構成の方法は特定のエラーを補足するときと一緒で、最初に記載したexcept文の下段に、別のexcept文を書くだけです。
考えられるエラーとその適切な処理方法
エラーが発生したら、適切に処理をしないといけません。
適切な処理を施すためには、どのようなエラーが発生する場合があるのか把握しておく必要があります。
Pythonであれば、大きく分けると2種類のエラーが発生しやすいです。
なぜエラーが発生するのか、万が一エラーが発生したらどのように処理するのかを解説していきます。
ZeroDivisionError
Pythonで発生しやすいエラーの1つ目は、ZeroDivisionErrorです。
エラーが発生したら、まずはどの箇所でエラーが発生しているのか、何が原因なのかを特定しないといけません。
エラーを効率的に発見するには、トレースバックから確認するのがよいでしょう。
トレースバックというのは、別名をスタックトレースと言い、例外が発生した箇所や呼び出された関数などが表示されている履歴のことです。
下の方から出力されるので、メッセージの下の部分に注目しましょう。
ZeroDivisionErrorというのは、0で除算をしたときに発生するエラーです。
ZeroDivisionErrorと表示された後に、division by zeroという文字が表示されるので、わかりやすいでしょう。
ZeroDivisionErrorが発生したら、try節に発生するエラーを記載します。
次にexcept節に補足する内容を書きこみます。
書きこむ内容は、エラーが発生したときに表示される文字が一般的です。
例えばユーザーが0で除算した場合、0で除算することはできませんというメッセージを出して対応したいとしましょう。
この場合はtry節に発生するエラーの内容、except節に0で除算することはできませんと書きます。
IndexError
要素数を超えているインデックス値を指定すると、IndexErrorと表示されます。
これもPythonで発生しやすいエラーの1つです。
例えばsample_list = [1, 2, 3]とプログラムの最初に書かれているのに
- print(sample_list[1])
- print(sample_list[2])
- print(sample_list[3])
- print(sample_list[4])
というプログラムを追加すると、要素が3つしかない状態で4つ表示するように記載されています。
このようなときにIndexErrorが発生するのです。
原因がわかれば、後は他のエラーと同じ方法で例外処理ができます。
try節に発生したエラーの内容を記載し、except節にメッセージを書きこみます。
IndexErrorの場合には、リストの範囲外ですなどと記載するのがよいでしょう。
try, exceptの魅力的な使い方
try,exceptには、様々な使い方が存在します。全ての例外をキャッチすることや、無視することも可能です。
魅力的な使い方も存在するので、2つ紹介したいと思います。
エラー内容の取得方法
try,exceptの使い方で、エラーの箇所を発見するのに役立つのがトレースバックです。
Pythonでは、except文で処理が行えない場合、クラッシュしてしまいます。
このような例外が発生すると、メッセージと一緒に表示されるのがトレースバックです。
トレースバックを活用すれば、例外の種類や呼び出された関数などが表示されます。
行番号も一緒に表示されるので、どこでエラーが起きているのかなどの内容を簡単に取得できるのです。
例外を発生させる場合のベストプラクティス
try,exceptを使用すると、例外を意図的に発生させることもできます。
意図的に例外を発生させて何か意味があるのかと思う人もいるでしょう。
本来例外処理というのは、
- 必要な箇所に絞って記載する
- 適切な種類を選ぶ
- エラーメッセージを使って分かりやすくする
- エラーの情報をログに出力する
以上がベストプラクティスです。
しかし、プログラムの内容が異常なケースだと、あえて例外を発生させることで、正しく処理できる場合もあるのです。
まとめ
今回はPythonで発生しやすいエラーの内容や、エラー発生時の例外処理について紹介してきました。
基本であるtry,exceptの意味や使い方を知っていれば、色々と応用できます。
特定のエラーを補足することはもちろんですが、複数のエラーや全てのエラーの補足も可能です。
最初は難しく感じる人もいるでしょうが、基本的なことを覚えてしまえば例外処理の際にとても役立ちます。