こんにちは、森山です。
前回のコラムでは、エラーメッセージを読んで、問題の場所を見つけて直す方法を学びました。点数を入力するプログラムで「欠席」と入力すると、ValueErrorが表示され、処理が途中で止まりましたね。
でも、利用者が入力を間違えるたびにプログラムが止まってしまうと、少し困りますよね。「整数で入力してください」と案内できれば、利用者も次に何をすればよいか分かります。
今回は、ハイスクールPythonの「7.2 try-except でエラーに負けないプログラム作り」に沿って、例外が起きたときの対応を用意する方法を学びましょう。
try-exceptって何?
try-exceptは、実行中に例外が起きたとき、あらかじめ用意した処理へ切り替えるための構文です。
例えば、文化祭で動画を上映するとき、機器の不調で動画を再生できなくなるかもしれません。そんなときに備えて、実行委員が写真を使った説明も準備しておけば、発表を続けられますよね。
プログラムでも、「まずこの処理を行い、もし特定の問題が起きたら、こちらの対応をする」と決めておけます。通常の処理を書く場所がtry、例外が起きたときの対応を書く場所がexceptです。
点数の入力に「もしも」を加えよう
前回の点数入力のプログラムに、エラー処理を追加してみましょう。
try:
score = int(input("点数を整数で入力してください:"))
print(f"あなたの点数は{score}点です")
except ValueError:
print("点数は80のような整数で入力してください")
print("点数の確認を終了します")
Google Colabのコードセルに貼り付けて実行し、まずは80と入力してみてください。次に、もう一度実行して「欠席」と入力してみましょう。表示される文章はどう変わったでしょうか?
ここがポイント!
input()は入力内容を文字列として受け取ります。int()は、その文字列を整数に変換します。”80″は変換できますが、”欠席”は変換できないため、ValueErrorが起きます。
このとき、tryの中の残りの処理は実行されず、except ValueError:の下に書いた処理へ移ります。つまり、点数を表示する行は飛ばされ、入力方法を案内する文章が表示されます。
対応が終わると、try-exceptの後にある、確認を終了する文章を表示します。前回は例外で止まっていた処理を、今回は自分で用意した案内につなげられました。
一方、80のように整数に変換できる値を入力した場合は、tryの中の処理が最後まで実行され、exceptの処理は実行されません。その後、同じように確認を終了する文章が表示されます。
ただし、このコードは自動で入力をやり直すものではありません。再入力するには、もう一度実行する必要があります。
書き方のルール
- try:の下には、例外が起きる可能性のある処理を書きます。
except ValueError:のように、対応する例外の種類を指定します。- tryとexceptは、行頭の位置をそろえます。
- それぞれの行末には:を付け、中の処理はインデントします。
今回のexcept ValueError:が対応するのは、ValueErrorです。種類の異なる例外が起きた場合、このexceptでは対応できません。
問題の種類によって対応を変えよう
1つのプログラムで、複数の種類の例外に備えることもできます。
文化祭の材料費を、参加人数で割って、1人分の金額を計算してみましょう。ここでは、材料費は0以上、人数は1以上の整数を入力する前提にします。
try:
total = int(input("材料費を整数で入力してください:"))
members = int(input("参加人数を整数で入力してください:"))
cost = total / members
print(f"1人分の金額は{cost}円です")
except ValueError:
print("材料費と人数は整数で入力してください")
except ZeroDivisionError:
print("参加人数が0では計算できません")
Google Colabで実行し、次の入力を順番に試してみましょう。それぞれの組み合わせを試すたびに、コードセルを実行し直してください。
- 材料費に1200、人数に4を入力する
- 材料費に1200、人数に「四人」を入力する
- 材料費に1200、人数に0を入力する
整数に変換できない文字列を入力すると、ValueErrorが起きます。一方、人数に0を入力すると、変換はできますが、割り算でZeroDivisionErrorが起きます。これは、0で割ろうとしたときに発生する例外です。
複数のexceptを書くと、起きた例外に合うものが上から順に探されます。最初に一致したexceptの処理だけが実行されるため、問題の種類に合わせて案内を変えられます。
なお、負の人数など、整数に変換できても用途に合わない入力はあります。そのような値の確認には、以前学んだif文などを使います。
エラー処理は、利用者への道案内
今回のポイントを整理しましょう。
- tryには通常の処理、exceptには例外が起きたときの対応を書く
- 例外が起きると、tryの残りの処理を飛ばし、対応するexceptへ移る
- 複数のexceptで、例外の種類ごとに対応を変えられる
try-exceptは、コードの間違いを自動で直す仕組みではありません。前回の:(コロン)の書き忘れのような構文エラーは、そのコードをtryの中に入れても対処できず、書き方を修正する必要があります。
エラー処理を考えるときは、「何が起こりそうか」と「そのとき、どう案内すればよいか」をセットで考えてみましょう。それが、利用者にとって使いやすいプログラムにつながります。
ハイスクールPythonの7.2では、例外が起きなかったときに使うelseや、最後の後処理に使うfinallyも紹介されています。基本の動きを確かめたら、そちらも合わせて読んでみてください。
最後までお読みいただき、ありがとうございました。
それではまた次回お会いしましょう!
