Python中級

中級 Pythonで学ぶ例外設計|練習問題編

導入

例外設計は、プログラムの堅牢性を高めるための重要な要素です。特に、実務においては予期しないエラーが発生することが多く、これを適切に処理することで、システムの信頼性を向上させることができます。本記事では、Pythonを使用した具体的な例外設計のシナリオに基づき、効果的なエラーハンドリングの方法を探ります。

教科書レベルの解説(例外設計)

重要な概念の整理

例外設計においては、エラーの種類を明確にし、それぞれに対する適切な処理を行うことが求められます。特に、ユーザー入力や外部システムとの連携時には、想定外の入力や応答が発生することがあります。こうした状況を考慮し、例外を適切にキャッチし、処理する設計が必要です。

コード例(Python)


def read_integer_from_user():
    try:
        user_input = input("整数を入力してください: ")
        value = int(user_input)
        return value
    except ValueError:
        print("無効な入力です。整数を入力してください。")
        return read_integer_from_user()
    except KeyboardInterrupt:
        print("\n入力が中断されました。")
        return None

result = read_integer_from_user()
if result is not None:
    print(f"入力された整数: {result}")

コードの行ごとの解説

  1. def read_integer_from_user(): – ユーザーから整数を読み込む関数を定義します。
  2. try: – 例外が発生する可能性のあるコードブロックを開始します。
  3. user_input = input(“整数を入力してください: “) – ユーザーに整数の入力を促します。
  4. value = int(user_input) – 入力された値を整数に変換します。ここでValueErrorが発生する可能性があります。
  5. return value – 正常に整数が取得できた場合、その値を返します。
  6. except ValueError: – 入力が整数に変換できなかった場合の処理を行います。
  7. print(“無効な入力です。整数を入力してください。”) – エラーメッセージを表示します。
  8. return read_integer_from_user() – 再帰的に関数を呼び出し、正しい入力を促します。
  9. except KeyboardInterrupt: – ユーザーが入力を中断した場合の処理を行います。
  10. print(“\n入力が中断されました。”) – 中断されたことを通知します。
  11. return None – Noneを返し、プログラムの流れを制御します。
  12. result = read_integer_from_user() – 関数を呼び出し、結果を取得します。
  13. if result is not None: – 入力が正常に行われた場合に処理を続けます。
  14. print(f”入力された整数: {result}”) – 入力された整数を表示します。

練習問題編

以下に例外設計に関連する練習問題を用意しました。各問題に対する模範解答と解説も記載しています。

問題1

ユーザーからの浮動小数点数の入力を受け取り、正しい値が入力されるまで再入力を促す関数を作成してください。

模範解答


def read_float_from_user():
    try:
        user_input = input("浮動小数点数を入力してください: ")
        value = float(user_input)
        return value
    except ValueError:
        print("無効な入力です。浮動小数点数を入力してください。")
        return read_float_from_user()

解説: この関数は、ユーザーから浮動小数点数を取得するためのもので、無効な入力があった場合には再帰的に呼び出されます。

問題2

ファイルを開く関数を作成し、ファイルが存在しない場合にはエラーメッセージを表示し、再度ファイル名を入力させるようにしてください。

模範解答


def open_file():
    while True:
        try:
            filename = input("ファイル名を入力してください: ")
            with open(filename, 'r') as file:
                return file.read()
        except FileNotFoundError:
            print("指定されたファイルは存在しません。再度入力してください。")

解説: この関数はファイルを開くことを試み、存在しない場合にはループ内で再入力を促します。

問題3

ユーザーが選択肢を入力する際、正しい選択肢が入力されるまで再度入力を促す関数を作成してください。選択肢は「A」「B」「C」のみとします。

模範解答


def select_option():
    options = ['A', 'B', 'C']
    while True:
        user_input = input("選択肢を入力してください (A/B/C): ")
        if user_input in options:
            return user_input
        else:
            print("無効な選択肢です。再度入力してください。")

解説: この関数は、ユーザーが正しい選択肢を入力するまでループし、無効な入力があった場合にはエラーメッセージを表示します。

まとめ

  • 例外設計は、エラー処理を通じてプログラムの堅牢性を向上させる手段です。
  • 具体的なシナリオに基づいたエラーハンドリングを実装することで、ユーザー体験を向上させることができます。
  • 適切な例外処理を行うことで、プログラムの信頼性を高めることが可能です。