エラー処理を活用したプログラムを作ろう

学習の目標

本章では、以下の内容を学習します。

  • try-except文を使った実用的なプログラムの作成方法を習得する
  • 段階的にエラー処理機能を追加する開発手法を学ぶ
  • ユーザー入力の検証とエラーハンドリングを実践する
  • 安全で使いやすいプログラムの設計方法を理解する
  • エラー処理を通じてプログラムの品質を向上させる手法を身につける

はじめに

これまでの章で、try-except文の基本的な使い方について学習してきました。

今回は、学習した内容を活用して、実際に役立つプログラムを一つ作成してみましょう。エラー処理の機能を段階的に追加していくことで、最初はシンプルなプログラムから始めて、最終的には安全で使いやすいプログラムに仕上げていきます。

作成するのは成績管理プログラムです。学生の名前と点数を管理し、平均点を計算する機能を持ったプログラムを作ります。最初はエラー処理がない状態から始めて、少しずつ改良を重ねていきましょう。

この過程を通じて、エラー処理がいかに重要で、プログラムの品質向上に役立つかを実感していただけるはずです。

ステップ1:基本的な成績管理プログラムを作成

まずは、エラー処理を含まない基本的なプログラムを作成してみましょう。

VS Codeでgrade_manager.pyというファイルを作成し、以下のコードを入力してください。

# 基本的な成績管理プログラム
students = []

print("=== 成績管理プログラム ===")
print("学生の名前と点数を入力してください")

# 学生情報の入力
name = input("学生の名前: ")
score = int(input("点数(0-100): "))

# 学生情報を辞書として保存
student = {"name": name, "score": score}
students.append(student)

# 結果表示
print("\n=== 登録された学生 ===")
print(f"名前: {student['name']}")
print(f"点数: {student['score']}点")

このプログラムを実行して、「田中太郎」と「85」を入力してみてください。

実行結果は以下のようになります。

=== 成績管理プログラム ===
学生の名前と点数を入力してください
学生の名前: 田中太郎
点数(0-100): 85

=== 登録された学生 ===
名前: 田中太郎
点数: 85点

正常に動作しますね。しかし、このプログラムには問題があります。点数の部分に「abc」のような文字列を入力すると、エラーが発生してプログラムが停止してしまいます。

ステップ2:点数入力のエラー処理を追加

次に、点数入力部分にエラー処理を追加してみましょう。

先ほどのコードを以下のように修正してください。

# エラー処理を追加した成績管理プログラム
students = []

print("=== 成績管理プログラム ===")
print("学生の名前と点数を入力してください")

# 学生の名前入力
name = input("学生の名前: ")

# 点数入力(エラー処理付き)
while True:
    try:
        score = int(input("点数(0-100): "))
        break  # 正常に変換できたらループを抜ける
    except ValueError:
        print("点数は数値で入力してください")

# 学生情報を辞書として保存
student = {"name": name, "score": score}
students.append(student)

# 結果表示
print("\n=== 登録された学生 ===")
print(f"名前: {student['name']}")
print(f"点数: {student['score']}点")

この改良により、ユーザーが文字列を入力してもプログラムが停止せず、正しい数値を入力するまで繰り返し入力を求めるようになりました。

「abc」と入力してからエラーメッセージを確認し、その後「85」と入力して正常に動作することを確認してみてください。

ステップ3:点数の範囲チェックを追加

点数は0から100の範囲で入力されるべきですが、現在のプログラムでは「-10」や「150」のような値も受け入れてしまいます。

範囲チェック機能を追加してみましょう。

# 範囲チェックを追加した成績管理プログラム
students = []

print("=== 成績管理プログラム ===")
print("学生の名前と点数を入力してください")

# 学生の名前入力
name = input("学生の名前: ")

# 点数入力(エラー処理と範囲チェック付き)
while True:
    try:
        score = int(input("点数(0-100): "))
        
        # 範囲チェックを追加
        if 0 <= score <= 100:
            break  # 正常な範囲なのでループを抜ける
        else:
            print("点数は0から100の間で入力してください")
            
    except ValueError:
        print("点数は数値で入力してください")

# 学生情報を辞書として保存
student = {"name": name, "score": score}
students.append(student)

# 結果表示
print("\n=== 登録された学生 ===")
print(f"名前: {student['name']}")
print(f"点数: {student['score']}点")

この改良により、点数が適切な範囲内でのみ受け入れられるようになりました。「150」と入力してエラーメッセージが表示され、「85」と入力すると正常に動作することを確認してみてください。

ステップ4:複数の学生を登録できるように拡張

今度は、複数の学生を登録できるように機能を拡張してみましょう。

# 複数学生対応の成績管理プログラム
students = []

print("=== 成績管理プログラム ===")

# 複数の学生を登録
while True:
    print("\n学生の情報を入力してください")
    
    # 学生の名前入力
    name = input("学生の名前(終了する場合は'q'を入力): ")
    
    # 終了判定
    if name.lower() == 'q':
        break
    
    # 点数入力(エラー処理と範囲チェック付き)
    while True:
        try:
            score = int(input("点数(0-100): "))
            
            if 0 <= score <= 100:
                break
            else:
                print("点数は0から100の間で入力してください")
                
        except ValueError:
            print("点数は数値で入力してください")
    
    # 学生情報を辞書として保存
    student = {"name": name, "score": score}
    students.append(student)
    print(f"{name}さんの情報を登録しました")

# 結果表示
print("\n=== 登録された学生一覧 ===")
for student in students:
    print(f"名前: {student['name']}, 点数: {student['score']}点")

この改良により、複数の学生の情報を連続して入力できるようになりました。「q」を入力することで入力を終了できます。

数人の学生情報を入力してから「q」で終了し、一覧が正しく表示されることを確認してみてください。

ステップ5:平均点計算機能を追加

最後に、登録された学生の平均点を計算する機能を追加してみましょう。

# 平均点計算機能付きの成績管理プログラム
students = []

print("=== 成績管理プログラム ===")

# 複数の学生を登録
while True:
    print("\n学生の情報を入力してください")
    
    # 学生の名前入力
    name = input("学生の名前(終了する場合は'q'を入力): ")
    
    # 終了判定
    if name.lower() == 'q':
        break
    
    # 点数入力(エラー処理と範囲チェック付き)
    while True:
        try:
            score = int(input("点数(0-100): "))
            
            if 0 <= score <= 100:
                break
            else:
                print("点数は0から100の間で入力してください")
                
        except ValueError:
            print("点数は数値で入力してください")
    
    # 学生情報を辞書として保存
    student = {"name": name, "score": score}
    students.append(student)
    print(f"{name}さんの情報を登録しました")

# 結果表示
print("\n=== 登録された学生一覧 ===")
if len(students) > 0:
    for student in students:
        print(f"名前: {student['name']}, 点数: {student['score']}点")
    
    # 平均点計算(エラー処理付き)
    try:
        total_score = sum(student['score'] for student in students)
        average = total_score / len(students)
        print(f"\n平均点: {average:.1f}点")
        print(f"登録学生数: {len(students)}人")
    except ZeroDivisionError:
        print("学生が登録されていないため、平均点を計算できません")
        
else:
    print("学生が登録されていません")

この最終版では、以下の機能が追加されました。

  • 平均点の計算と表示
  • 登録学生数の表示
  • 学生が一人も登録されていない場合の適切な処理

ステップ6:プログラムの動作確認

完成したプログラムを実行して、様々なパターンで動作を確認してみましょう。

正常なケースの確認

=== 成績管理プログラム ===

学生の情報を入力してください
学生の名前(終了する場合は'q'を入力): 田中太郎
点数(0-100): 85
田中太郎さんの情報を登録しました

学生の情報を入力してください
学生の名前(終了する場合は'q'を入力): 佐藤花子
点数(0-100): 92
佐藤花子さんの情報を登録しました

学生の情報を入力してください
学生の名前(終了する場合は'q'を入力): q

=== 登録された学生一覧 ===
名前: 田中太郎, 点数: 85点
名前: 佐藤花子, 点数: 92点

平均点: 88.5点
登録学生数: 2人

エラー処理の確認

点数入力で「abc」と入力してエラーメッセージが表示されること、「150」と入力して範囲外エラーが表示されることを確認してください。

学生未登録の場合の確認

プログラムを実行してすぐに「q」を入力し、学生が登録されていない場合の処理も確認してみてください。

プログラムの改良ポイント

エラー処理の効果

このプログラムでは、以下のような場面でエラー処理が活用されています。

数値変換エラーの処理 ユーザーが文字列を入力してもプログラムが停止せず、再入力を促します。

データ検証の実装 点数の範囲チェックにより、無効なデータの登録を防止しています。

ゼロ除算エラーの防止 学生が登録されていない場合の平均点計算エラーを適切に処理しています。

ユーザビリティの向上

エラー処理を追加することで、以下のような改善が実現されました。

  • プログラムが途中で止まることがない
  • 分かりやすいエラーメッセージでユーザーをガイド
  • 間違った入力をしても安全に再入力が可能

まとめ

本章では、try-except文を活用した実用的なプログラムを段階的に作成しました。

最初はシンプルな機能から始めて、少しずつエラー処理を追加していくことで、安全で使いやすいプログラムに仕上げることができました。

エラー処理の重要性を実感できたのではないでしょうか。適切なエラー処理により、プログラムの安定性とユーザビリティが大幅に向上します。

段階的な改良により、複雑な機能も無理なく実装できることも学習できました。一度にすべてを完璧に作ろうとせず、基本機能から始めて徐々に改良していくアプローチは、実際の開発でも非常に重要な考え方です。

今回作成したプログラムは、リストや辞書、ループ、条件分岐、そしてエラー処理など、これまで学習してきた多くの要素を組み合わせた実践的なものです。このような統合的なプログラムを作成できるようになったことは、大きな成長の証です。

このセクションは有料サブスクリプションへの登録、またはログインが必要です。完全なコンテンツにアクセスするには、料金ページ(/pricing)をご覧ください。購入済みの場合は、ログインしてください。

Starterプランでより詳しく学習

この先のコンテンツを読むにはStarterプラン以上が必要です。より詳細な解説、実践的なサンプルコード、演習問題にアクセスして学習を深めましょう。

作成者:とまだ
Previous
try-except文の基本を学ぼう