
input 関数などで、数字だけを入力して欲しいのに、英単語とか入力されたら困りますよね。

例外処理 try-except を使って、実行中のエラーをキャッチしてみよう
例外処理をしなかった場合の記述
以下例は、数字の入力を求め、その数字を出力するプログラムになります。
pythonx = int(input("数字を入力してください:")) print("入力された数字は、", x, " です。")
このプログラムを実行し、「a」とされた場合、プログラム作成者が期待した処理は行われず、エラーとなり処理が止まってしまいます。
実行結果数字を入力してください:a Traceback (most recent call last): File "try-except.py", line 1, in <module> x=int(input("Please enter a number:")) ValueError: invalid literal for int() with base 10: 'a'
エラーValueError
で処理が止まってしまったことが確認できます。処理が止まってしまうため、それ以降に書かれているコードが実行されません、例外処理をすることで処理を止めることなく継続することができます。
例外処理
try, except
この例では、数値以外の入力があった場合、例外処理を行った後、再び入力を求めるプログラムになります。
pythonwhile True: try: x = int(input("数字を入力してください:")) print("入力された数字は、", x, " です。") break except ValueError as e: print(e) print("もう一度入力してください。")
キーボードより「a」を入力した場合の動作は以下のようになります。
実行結果数字を入力してください:a invalid literal for int() with base 10: 'a' もう一度入力してください。 数字を入力してください:
「invalid literal for int() with base 10: ‘a’」で、エラー内容が確認できます。例外エラーが発生したため、break
部分の処理は行われず、再び入力を求める部分から処理が再開されます。
複数の except 節 を記述
pythonwhile True: try: x = int(input("数字を入力してください:")) v = 10 / x print("10 を ", x " で割った答えは、", v, " です。") break except ValueError as e: print("ValueErrorが発生しました。") except ZeroDivisionError as e: print("ZeroDivisionErrorが発生しました。") print("もう一度入力してください。")
except
節 を複数記述することができます。このプログラムの場合、0(ゼロ)を入力された場合、ZeroDivisionError
が発生して例外処理が実行されています。
実行結果数字を入力してください:0 ZeroDivisionErrorが発生しました。 もう一度入力してください。 数字を入力してください:
この例の場合、エラーが発生した際、個別の例外処理を記述することができます。
複数の except 節 をまとめて記述
pythonwhile True: try: x = int(input("数字を入力してください:")) v = 10 / x print("10 を ", x " で割った答えは、", v, " です。") break except ( ValueError, ZeroDivisionError ) as e: print(e) print("もう一度入力してください。")
except
節 にカンマ(,)区切りで複数の例外エラーを並べることができます。この例の場合、エラーが発生した際、同一の例外処理をすることになります。
except 節にシステム終了以外のすべての例外を記述
except
節に組み込み例外の基底クラスのException
を使用した場合の記述例になります。
pythonwhile True: try: x = int(input("数字を入力してください:")) v = 10 / x print("10 を ", x " で割った答えは、", v, " です。") break except Exception as e: print(e) print("もう一度入力してください。")
プログラム作成者が想定していない例外をキャッチする可能性があるため、可能な限り想定した例外を記述することが望まれます。
例外が発生しなかった場合のみ実行される else 節の記述
pythonwhile True: try: x = int(input("数字を入力してください:")) v = 10 / x print("10 を ", x " で割った答えは、", v, " です。") except ( ValueError, ZeroDivisionError ) as e: print(e) print("もう一度入力してください。") else: print("エラーなく処理がおこなわれました。") break
例外が発生しなかった場合、入力内容の結果と、else
節の処理が実行されます。
実行結果数字を入力してください:2 10 を 2 で割った答えは、 5.0 です。 エラーなく処理がおこなわれました。
try 文の終了時に必ず処理される finally 節を記述
pythonwhile True: try: x = int(input("数字を入力してください:")) v = 10 / x print("10 を ", x " で割った答えは、", v, " です。") except ( ValueError, ZeroDivisionError ) as e: print(e) print("もう一度入力してください。") else: print("エラーなく処理がおこなわれました。") break finally: print("終了処理")
finally
節をtry
文 に記述した場合、例外エラーの有無に関係なく、実行されます。この例の場合、例外エラーが発生しなかった場合break
部分が処理されますが、while
文のループから抜ける前に、finally
節の記述が実行されていることがわかります。
実行結果数字を入力してください:2 10 を 2 で割った答えは、 5.0 です。 エラーなく処理がおこなわれました。 終了処理
おわりに

例外と言いながら、エラーの発生を想定するなら、例外処理try-exceptを使わなくてもいいのでは?

プログラム作成者や、そのプロジェクトのポリシーにも関係するね。例外処理がバグの温床にならないようにすれば、積極的に使っていってもいいんじゃないかな。
よろしければクリックしていただけると嬉しいです。
コメント