プログラミングの学習を進めるうえでエラー対策は避けられません。エラーに対応することで勉強にはなりますが、その都度手を止められるのは困りものです。
そこで、今回はエラーが出てもプログラムを続行してくれるtry・except文について解説します。
その文と合わせて使われるelse・finallyについても書いているので気になる方はぜひ最後までご覧ください。
例外処理とは?
例外処理とはエラーが出たときに行う処理のことです。以下のプログラムではどんなエラーが予想できるでしょうか?
1 2 3 4 5 6 7 8 9 |
a = input('数値を入力\n') b = 5 / int(a) print('答え:', b) #出力結果 数値を入力 2 答え: 2.5 |
ユーザーに入力してもらった数値で5を割っています。2を入力しているので「5÷2」で2.5が出力されていますね。
しかし、0を入力したらエラーになります。0で割ることはできないので「ZeroDivisionError: division by zero」を検出してプログラムは止まってしまいます。
1 2 3 4 5 6 7 |
#出力結果 数値を入力 0 Traceback (most recent call last): File "C:/Python/Python38/sample.py", line 3, in <module> b = 5 / int(a) ZeroDivisionError: division by zero |
エラーを検出した段階でプログラムは止まってしまうので「答え:」の文が出力されていません。
このように途中で異常終了してしまうのを回避するために使うのがtry・except文です。
try・except文
特定の例外を検出
- try文:エラーになるかもしれない処理
- except文:検出したいエラーとそのときの対処法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
try: a = input('数値を入力\n') b = 5 / int(a) print('答え:', b) except ZeroDivisionError: print('0はダメ') #出力結果(正常) 数値を入力 2 答え: 2.5 #出力結果(エラー) 数値を入力 0 0はダメ |
これでエラーが出たときに何がダメだったのかが分かりやすくなりましたね。
この処理は、0を入力したときだけの対処です。間違って文字を入力すると、以下のように異常終了してしまいます。
1 2 3 4 5 6 7 |
#出力結果(異常) 数値を入力 k Traceback (most recent call last): File "C:/Python/Python38/sample.py", line 5, in <module> b = 5 / int(a) ValueError: invalid literal for int() with base 10: 'k' |
今度は「ValueError」が出てきましたね。「入力された値が文字になっているので間違っていますよ」と言っています。
このように、想定できるエラーは複数あります。そういった場合は、except文を追加することで対応できます。
複数の例外を検出
- try文:エラーになるかもしれない処理
- except文1つ目:検出したいエラーとそのときの対処法
- except文2つ目:検出したいエラーとそのときの対処法
- except文は3個でも4個でも追加できる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
try: a = input('数値を入力\n') b = 5 / int(a) print('答え:', b) except ZeroDivisionError: print('0はダメ') except ValueError: print('「数値」だけ!') #出力結果(異常) 数値を入力 k 「数値」だけ! |
この例では、「k」と入力しているので「ValueError」になりますが、2つ目のexcept文が実行されていいるのが分かります。
このようにエラーごとに処理を分けることはできますが、すべてのエラーを予期できるわけではありません。
どんなエラーにも対応できるように「Exseption」があります。
全ての例外を検出
- try文:エラーになるかもしれない処理
- except文:Exceptionをわたす
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
try: a = input('数値を入力\n') b = 5 / int(a) print('答え:', b) except Exception: print('ダメ!') #出力結果(異常) 数値を入力 0 ダメ! #出力結果(異常) 数値を入力 k ダメ! |
「Exception」を使うとすべてのエラーに対応してくれます。出力結果からも分かるように、文字を入力した場合でも0を入力した場合でもexcept文が実行されていることが分かります。
ですが、このままではどんなエラーが出たか分かりません。そこで「as」を使うとエラーの種類を見ることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
try: a = input('数値を入力\n') b = 5 / int(a) print('答え:', b) except Exception as e: print('ダメ!', e) #出力結果(異常) 数値を入力 0 ダメ! division by zero #出力結果(異常) 数値を入力 k ダメ! invalid literal for int() with base 10: 'k' |
「Exception as e」とすることで検出したエラーをe変数に格納しています。それをprint関数で出力しています。
英語で「as」とは「~として」という意味があるので「Exception as e」は「Exception(エラー)をeとして扱う」という意味になります。
他にも「as」はファイル操作やモジュールのインポートでも使われるので要チェックです。
else・finally文
else文
tyr文の処理が正常に終了したときに実行される文です。もし、except文の処理が実行された場合はelse文の処理は無視されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
try: a = input('数値を入力\n') b = 5 / int(a) print('答え:', b) except Exception as e: print('ダメ!', e) else: print('成功!') #出力結果(正常) 数値を入力 2 答え: 2.5 成功! #出力結果(異常) 数値を入力 0 ダメ! division by zero |
正しく数値を入力したときはelse文の成功まで出力されていますが、0を入力した場合はexcept文が実行されるだけでelse文は実行されません。
finally文
tyr・except文の処理が終了したときに実行される文です。except文の処理が実行されてもされていなくてもfinally文の処理は実行されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
try: a = input('数値を入力\n') b = 5 / int(a) print('答え:', b) except Exception as e: print('ダメ!', e) finally: print('終了') #出力結果(正常) 数値を入力 2 答え: 2.5 終了 #出力結果(異常) 数値を入力 k ダメ! invalid literal for int() with base 10: 'k' 終了 |
処理が正常に終わってもエラーを検出してもfinally文の処理は実行されています。
処理をリトライさせる
例外処理にtry・except文を使うことは解説しましたが、これだけだと例外を処理して終了してしまいます。
そうではなく正常に終了するまで続けたい場合、つまり処理をリトライさせたい場合のプログラムを考えてみましょう。
for文でのリトライ
- for文でリトライする回数を決める
- try・except文に処理を書く
- else文でbreakする
- 正常に終了したらfor文を抜けるため
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
for i in range(3): try: a = input('数値を入力\n') b = 5 / int(a) print('答え:', b) except Exception as e: print('ダメ!', e) else: break print('終了') #出力結果(ループ2回) 数値を入力 0 ダメ! division by zero 数値を入力 5 答え: 1.0 終了 #出力結果(ループ3回) 数値を入力 k ダメ! invalid literal for int() with base 10: 'k' 数値を入力 0 ダメ! division by zero 数値を入力 2 答え: 2.5 終了 |
range(3)としているので3回まではリトライしてくれます。この回数は自由に変更できます。
while文でのリトライ
リトライの回数を無制限にしたい場合はwhile文も使えます。
- 「while True」で始める
- else文にbreakを渡す
1 2 3 4 5 6 7 8 9 10 11 12 13 |
while True: try: a = input('数値を入力\n') b = 5 / int(a) print('答え:', b) except Exception as e: print('ダメ!', e) else: break print('終了') |
「while True」にしているので常にループ処理が実行されます。つまり、正常に終了する以外にループを脱することはできないということです。
まとめ
- try文:エラーになりそうな処理を書く
- except文:エラーの検出とそのときの処理
- else文:正常終了したときの処理
- finally文:終了したときの処理
プログラミング言語のなかでも人気の高いPythonを学習する教材を紹介します。 最近ではプログラミングスククールがたくさんあるので迷うと思います。 ですが、まずは無料教材から始めてみましょう。苦労した分だけ力がつきます。 […]