【Python】例外処理 try except の使い方

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

わたし
わたし
例外処理 try-except を使って、実行中のエラーをキャッチしてみよう

例外処理をしなかった場合の記述

以下例は、数字の入力を求め、その数字を出力するプログラムになります。

x = 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

この例では、数値以外の入力があった場合、例外処理を行った後、再び入力を求めるプログラムになります。

while 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 節 を記述

while 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 節 をまとめて記述

while 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を使用した場合の記述例になります。

while True:
    try:
        x = int(input("数字を入力してください:"))
        v = 10 / x
        print("10 を ", x " で割った答えは、", v, " です。")
        break
    except Exception as e:
        print(e)
        print("もう一度入力してください。")

プログラム作成者が想定していない例外をキャッチする可能性があるため、可能な限り想定した例外を記述することが望まれます。

例外が発生しなかった場合のみ実行される else 節の記述

while 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 節を記述

while 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を使わなくてもいいのでは?
わたし
わたし
プログラム作成者や、そのプロジェクトのポリシーにも関係するね。例外処理がバグの温床にならないようにすれば、積極的に使っていってもいいんじゃないかな。

この記事がお役に立ちましたら幸いです。

では、また。

※本サイトの漫画やイラストはフィクションであり、実在の製品・団体・人物・地名とは関係ありません。
※本サイトに掲載する情報には充分に注意を払っておりますが、その内容について保証するものではありません。
※本サイトの使用ならびに閲覧によって生じたいかなる損害にも責任を負いかねます。
タイトルとURLをコピーしました