はじめに
今回の記事では、プログラムの「例外処理」について説明していきます。これまでのブログ(第1回~第6回)ではプログラムの基本について解説してきましたが、例外処理を学ぶことによって途中で動作が止まらない、エラーのないプログラムを作ることができます。
今回でプログラミング基本編は終了です!次回から実践編に進みます。
プログラミング未経験や学び始めの方に読んでいただくことを前提として、つまずきやすい部分(実際に筆者がつまずいた部分)や、実際に使うときの注意点についても説明していきます。
もくじ
- 概要 (はじめに) python
- もくじ
- 例外処理って何? ~エラーとの関係~
- 例外処理 どんなときに使う?
- 基本の書き方 「try」と「except」のセット
- 例外処理をくわしく書いてみよう ~エラーの種類と「else」「finally」~
- 例外処理を書くときのポイント(著者が詰まったところ)
- まとめ
例外処理って何? ~エラーとの関係~
「例外処理」といっても何が例外なのでしょうか。
例外処理とは、「プログラムでエラーが発生したときに行う処理」のことです。ここでいう例外とはエラーのことです。
例外処理の「例外」って何?
プログラムを書いていると、エラーが発生して途中で動かなくなることがあります。
例えば、関数のなかで引数から数値を受け取って計算をしたいとき、引数に文字が入ってきてしまうと計算することができません(※ただし、足し算は文字列同士で足し算を行うことができます)。このままではその時点で「計算ができないよ」というエラーが出てしまい、プログラムが止まってしまいます。
そこで、エラーが出なかった場合・エラーが出た場合で処理を分けて書くことができます。これが「例外処理」です。
例外処理はどんなときに使う?
例外処理を書くと、予期しない値やデータが入ってきた場合でも対応できるので、動きが止まったりすることがありません。
また、エラーが出た場合に「どんなエラーが出たか?」の記述を一緒に表示することができるので「なぜか分からないけど止まった」「よくわからないけど動いてる」という不明点をつぶすことができます。
具体例をあげると
・予期しない値が入ってくる(数値が欲しいのに文字が入ってくる場合)
・変換や計算ができない(割り算などの場合、0で割ろうとするとエラーになる)
・参照するデータ・値がない(リストに存在しないインデックスを確認しようとしている)
などが起こりうる場合に例外処理を使います。
例外処理の基本の書き方 「try」と「except」のセット
Pythonにおいて、例外処理は「try」と「except」を使って書くことができます。
「try」と「except」はセットで使います。tryの下に行いたい処理を書き、exceptの下に「tryの中でエラーが起きた場合の処理」を書きます。
tryの中でエラーが発生すると、tryの中でそれ以降の処理は行われずexceptの処理に移ります。
例外処理をくわしく書いてみよう! ~エラーの種類と「else」「finally」~
エラーの種類ごとに例外処理を書く!…どんなエラーが出ているか把握しよう
try・exceptだけで例外処理を書くと、「try以下のどこかでなんらかのエラーが起きている」ことだけ把握できます。プログラムを1人で作って確認するにはこれでもよいですが、誰かと一緒にプログラムを書いたりするさいには「どんな種類のエラーが起きている?」が分かったほうが親切です。
また、エラーの種類ごとにexceptの処理を分けると「こんなエラーなのでこういう処理をします!」が明確になり、実際にプログラムを使用するうえでも不安がなくなります。
上の画像・左は割り算を行う関数(def division(x,y))です。このとき、どんなエラーが考えられるでしょうか?
・引数が適切な数値ではないため、計算ができないエラー「TypeError」・・・不適切な型の値です
・0で割ろうとするエラー「ZeroDivisionError」・・・0で割れません
この2つが考えられるので、このエラーに対応する表示を出す処理を書くことができます。
exceptの後ろにエラーの種類を指定すると、指定したエラーが発生した場合の処理を書くことができます。
エラーがなかった時の処理、エラーの有無に関係ない処理・・・「else」と「finally」
tryの中でエラーが起こらなかった場合の処理を書きたい場合や、エラーの有無に関係なく必ず行う処理を書きたい場合、それぞれ「else」と「finally」を使います。
エラーと例外処理をより細かくコントロールするなら、このような書き方を覚えておくと便利です。
例外を書くときのポイント(著者が詰まったところ)
・if文じゃダメ?
「処理を振り分ける」という点では、例外処理は条件分岐の「if・・・」と似ているような気がします。エラーが出そうなときはifで分けたらいいのでは?どう使い分けるの?と思います。
try・exceptの例外処理は、if文と違ってエラーを「つかまえる」に近いです。
たとえばif文でエラーの可能性を無くそうとするとき、if・・・そのまた下にif・・・というかたちで入れ子のようにif文を書いたり、elifでたくさん羅列することになります。しかしこれではプログラムが長く読みづらくなってしまう上に、処理の記述が漏れているとエラーを発見することができません。
try・exceptでは、try内の処理が複雑でもその範囲内すべてからエラーを見つけ出すことができるので、エラーの見逃しがなくなり、ミスを減らすことができます。
まとめ
例外処理とは、「プログラムでエラーが発生したときに行う処理」のことです。数値が欲しい場合に文字列を受け取ってしまったり、存在しない値やデータを参照しようとしてエラーが出た場合に別の処理を書くことができます。
例外処理は基本的に「try」と「except」をセットにして記述します。
「try」の下には行いたい処理を、「except」の下にはtryのなかでエラーが出た場合の処理を書きます。例外処理はエラーの種類によって対応する書き方にすることもできます。また、振り分ける処理としてif文との違いを理解しておくと使うときに迷いがありません。
最初からエラーを網羅することは難しいですが、少しずつ例外処理に慣れていくとしっかりとしたプログラムを作れるようになるので、ぜひ挑戦してみてください。
次回からはここまでの基本を生かして、初歩的なプログラムを作る実践編を掲載します。
実際に詰まった部分をメインにして、数回に分けて説明していくので一緒に学んでいただけると嬉しいです(著者も頑張ります!)
ここまで読んでくださってありがとうございました!
コメント