Pythonには、例外処理という仕組みがあります。
これはとても便利なのですが、初心者のうちは難しいと感じてしまうかもしれません。
この記事では、Python初学者が例外処理を使いこなすために
という内容をまとめました。
実務で使うにはもう少し覚えることがありますが、その最初のステップとしてこれだけはマスターしましょう!
この記事の対象者はPythonでif文やinput文、print文が使える必要がありますが、
できるだけ詳しく丁寧に説明しますので、安心して読み進めてください。
なお、時間がなくて「とりあえずざっくりでも良いから知っておきたい」と言う方には、こちらの記事もおすすめします。
例外処理の基礎
そもそも「例外処理ってなに?」という方のため、例外処理の基本的な解説とエラーが起きる原因について説明します。
例外処理とは?
例外処理とは、プログラム(スクリプト)にエラーが発生したとき、その処理を中断して代わりに別の処理を行う機能のことを言います。
ユーザーが予期せぬ入力を行った場合、それに対応する処理を用意することで、プログラムがエラーによって中断されないように対応することができます。
Pythonでエラーが起きる原因
エラーの原因は、主に二つに分類されます。
開発者側(プログラミング)の問題
これはユーザーのせいではありませんので、テスト段階で気が付いて対応しましょう。
利用者側(ユーザー)問題
プログラムに問題がなくても、使い方によって起きてしまうエラーがあります。
その場合、悪いのはユーザーではなく、そのような状況を想定せずにプログラミングした開発側に問題があります。
そして、これはコードによって対策することができます。
よくあるエラーの種類
多くのユーザーは悪気があってエラーを起こすわけではありません。
(そういう人もいますが、、、)
- 整数しか入れられないのに、少数を入れた
- 文字を入れて欲しいのに、数値を入れた
- 0で割ってしまった
- 参照するはずのファイルがない
など、様々な状況・理由があります。
ここでは、Pythonで発生する主なエラーの一部をご紹介します。
このようなエラーが発生したとき、そのエラー内容によってあらかじめ用意した処理を実行することができます。
それが、「例外処理」なのです。
基本のスクリプトについて
始めに、サンプルとなるスクリプトを紹介します。
「割り勘を計算するアプリ」をイメージしてください。
while True:
price = int(input('金額は?: '))
count = int(input('人数は?: '))
print('一人当たりの金額は ' + str(price // count))
print('-' * 25)
while Trueにより、停止するまで永遠に繰り返すようにしています。
(無限ループですね。)
金額と人数を入力すると、一人当たりの金額を計算して出力します。
その際、端数を切り捨て(//)にしていますので、幹事が多く負担する仕様となっております。
これをベースに説明を進めていきます。
例外処理を使わない場合
では、上のスクリプトを実行したとき、どのような状況でエラーが出るのでしょうか?
ValueError
人数を入力する際、「1」「5」のように整数を入れて欲しいのですが、
間違えて「1.5」のように小数値を入れてしまうかもしれません。
また、「あ」のように文字を入れてしまう間違いも考えられますね。
さらに、割り算の処理で注意しなければならないのが
「0で割る」という処理の対策です。
プログラミングでは、
「0で割り算をする」とエラーになると覚えておきましょう。
if文を使ってエラーに対応する
例外処理の前に、上のエラーが発生しないよう、
if文で対応してみましょう。
と思ってもらえれば良いです。
while True:
price = input('金額は?: ')
if not price.isnumeric():
print('整数を入力してください')
print('-' * 25)
continue
count = input('人数は?: ')
if not count.isnumeric():
print('整数を入力してください')
print('-' * 25)
continue
price = int(price)
count = int(count)
if count == 0:
print('0は入力しないでください')
print('-' * 25)
continue
print('一人当たりの金額は ' + price // count)
print('-' * 25)
実行して、エラーが出そうな入力をしてみましょう。
-------------------------
金額は?: 1000
人数は?: a
整数を入力してください
-------------------------
金額は?: 1000
人数は?: 1.5
整数を入力してください
-------------------------
金額は?: 1000
人数は?: 0
0は入力しないでください
-------------------------
文字を入れても、小数値を入れても、
と対応されますね。
また、0を入れると、
と対応されます。
これで、ユーザーが整数値以外の値を入れてもエラーがでなくなりました。
isnumericって?
なお、上のスクリプトでは「isnumericメソッド」を使っていますが、これは整数かどうかを確認するために使っています。
本題とは関係ありませんので今回は説明しませんが、
気になる方は調べてみてください。
例外処理を使ってエラーに対応する
上記の通り、ifでも対応できるのですが、Pythonには「例外処理」という便利な機能があるのでやってみましょう。
while True:
try:
price = int(input('金額は?: '))
count = int(input('人数は?: '))
print('一人当たりの金額は ' + str(price // count))
except ValueError:
print('整数を入力してください')
except ZeroDivisionError:
print('0を入力しないでください')
finally:
print('-' * 25)
実行して、エラーが出そうな入力をしてみましょう。
-------------------------
金額は?: 1000
人数は?: a
整数を入力してください
-------------------------
金額は?: 1000
人数は?: 1.5
整数を入力してください
-------------------------
金額は?: 1000
人数は?: 0
0を入力しないでください
-------------------------
結果はif文を使った処理と同じですが、こちらの方がスクリプトが短く、分かりやすいですね。
それぞれ詳しく説明していきます。
Pythonの例外処理では、
基本的に「try」「except」「finally」を覚えておけばOKです。
tryの基本
まずは、tryの使い方から説明します。
tryの中には、「基本の処理」を記述します。
言い方を変えると、「エラーが出そうな処理」を記述するという意味です。
今回のスクリプトでは、割り勘を計算するために3つの処理が必要です。
- input関数で金額を入力してもらう
- input関数で人数を入力してもらう
- 金額÷人数を計算する
try:
price = int(input('金額は?: '))
count = int(input('人数は?: '))
print('一人当たりの金額は ' + str(price // count))
このとき、入力値に問題があるとエラーが出ますし、計算をするときに0で割り算するとエラーが出ます。
そのエラーが発生したとき、スクリプトが止まるのではなく、エラー内容に対する処理を実行することができるのです。
exceptの基本
次に、exceptの使い方を説明します。
上のtryで記述した「基本の処理」に対し、実際にエラーが出たときの処理を記述するのがexceptです。
今回のスクリプトでは、文字や小数値を入力するとValueErrorが出ますし、0で割り算をするとZeroDivisionErrorが出ます。
この2つのエラーが出たときの処理をそれぞれ記述しています。
except ValueError:
print('整数を入力してください')
except ZeroDivisionError:
print('0を入力しないでください')
exceptはいくつでも記述することができます。
エラーごとに処理を変える場合、上のようにエラーごとに処理を用意すれば良いのです。
なお、exceptは具体的なエラーを省略することもできますが、そのような記述は公式には推奨されていません。
一応記載しておきますが、
while True:
try:
price = int(input('金額は?: '))
count = int(input('人数は?: '))
print('一人当たりの金額は ' + str(price // count))
except:
print('何かエラーが発生しました')
finally:
print('-' * 25)
というように「except」のみでエラーを記述しない場合、全てのエラーに対応することができます。
-------------------------
金額は?: 1000
人数は?: a
何かエラーが発生しました
-------------------------
金額は?: 1000
人数は?: 1.6
何かエラーが発生しました
-------------------------
金額は?: 1000
人数は?: 0
何かエラーが発生しました
-------------------------
ただし、上のように、どんなエラーに対してどのような処理を実行するかを指定することはできません。
繰り返しますが、この記述は推奨されていませんし、
どんなエラーが発生したのかが分からないと困ります。
finallyの基本
最後に、finallyについて説明します。
上のスクリプトでは、エラーが出なければtry内の処理が実行されますし、エラーが出れば対応するexcept内の処理が実行されます。
このとき、エラーが出ても出なくても、必ず実行して欲しいことがあります。
それは、「———————-」の区切りのprint文です。
エラーが出ても出なくても、処理ごとに区切りは必要ですよね。
そのような処理は、finally内に記述するのです。
非常に分かりやすいですね。
なお、記述のルールとして、「exceptより後ろに記述する」ということを覚えておきましょう。
もう少しステップアップ
Pythonで例外処理を使う場合、この3つを組み合わせるだけでも基本的な処理はできるでしょう。
最後に、try文ではelseも使えるという例をご紹介します。
else
if文では、条件に対するFalseの処理をelseに記述しますね。
tryでは、エラーがでない場合に必ず実行する処理を記述します。
少し分かりにくいですね?
どのような状況があるのか、上のスクリプトに追加してみましょう。
while True:
try:
price = int(input('金額は?: '))
count = int(input('人数は?: '))
print('一人当たりの金額は ' + str(price // count))
except ValueError:
print('整数を入力してください')
except ZeroDivisionError:
print('0を入力しないでください')
else:
print('正常に終了しました')
finally:
print('-' * 25)
追加した部分は、
else:
print('正常に終了しました')
です。
実行すると、以下のようになります。
-------------------------
金額は?: 1000
人数は?: 5
一人当たりの金額は 200
正常に終了しました
-------------------------
もちろん、エラーが出るときはelseの処理が実行されません。
-------------------------
金額は?: 1000
人数は?: a
整数を入力してください
-------------------------
これを見ると、
「tryに一緒に記述して良いのでは?」
と思いませんか?
つまり、
while True:
try:
price = int(input('金額は?: '))
count = int(input('人数は?: '))
print('一人当たりの金額は ' + str(price // count))
print('正常に終了しました')
except ValueError:
print('整数を入力してください')
except ZeroDivisionError:
print('0を入力しないでください')
finally:
print('-' * 25)
これで良いじゃない?ということです。
もちろん、実行結果は同じなのでその通りなのですが、tryとelseは明示的に使い分けることができます。
それは、
- エラーが出るかもしれない処理はtryに記述
- エラーが出ない処理はelseに記述
というように使い分けることで、スクリプトが分かりやすくなります。
elseは必須ではありませんので、必要性を感じない場合は全てtryに記述すれば良いです。
なお、記述のルールとして、「exceptより後ろ、finallyより前に記述する」ということを覚えておきましょう。
elseといえば、他のプログラミング言語ではif文でしか使えないことが多いですが、Pythonではfor文やwhile文、そしてtry文でも使えるのです。
これは面白い仕組みだと思います。
まとめ
いかがだったでしょうか。
Pythonでの例外処理について解説しました。
初心者の方に向けて基礎から説明しているので、経験者の方には説明が長いと思われるかもしれません。
今回はPython初学者の方に最低限覚えて欲しい例外処理を説明しました。
例外処理は結構奥が深いので、工夫次第でいろいろな処理ができます。
ここで紹介した内容をベースとして、他の方法も試してみると良いでしょう。
Pythonについて詳しく知りたいという方は、こちらの書籍もおススメです。
それでは、ステキなPythonライフを!
「最低限これだけできればOK!」