try-except文の基本を学ぼう

学習の目標

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

  • try-except文の基本構文と動作原理を理解する
  • エラーをキャッチして適切に処理する方法を学ぶ
  • 数値変換でのエラー処理を実践する
  • ユーザーフレンドリーなエラーメッセージの表示方法を習得する
  • プログラムが途中で止まらない安全な処理の書き方を身につける

はじめに

これまでの章では、様々な種類のエラーについて学習してきました。

エラーが発生すると、通常はプログラムが途中で止まってしまいます。しかし実際のアプリケーションでは、エラーが発生してもプログラムを継続して実行したい場面が多くあります。

例えば、ユーザーが間違った値を入力した時に、プログラム全体が停止してしまうのではなく、「正しい値を入力してください」というメッセージを表示して、再度入力を促したいですよね。

Pythonには、このようなエラーを「捕まえて」適切に処理するための仕組みが用意されています。それがtry-except文です。今回は、この重要な機能について詳しく学んでいきましょう。

try-except文の基本構文

try-except文とは

try-except文は、エラーが発生する可能性のあるコードを実行し、エラーが発生した場合に別の処理を行うための仕組みです。

基本的な構文は以下のようになります。

try:
    # エラーが発生する可能性のあるコード
    処理A
except:
    # エラーが発生した時の処理
    処理B

この構文では、まずtryブロック内のコードが実行されます。もしエラーが発生せずに正常に実行されれば、exceptブロックは実行されません。一方、tryブロック内でエラーが発生した場合は、即座にexceptブロックの処理が実行されます。

最初のtry-except文を試してみよう

VS Codeでtry_except_basic.pyというファイルを作成し、以下のコードを入力してみましょう。

try:
    result = 10 / 0  # ゼロで割り算(エラーが発生する)
    print(f"計算結果: {result}")
except:
    print("計算でエラーが発生しました")

print("プログラムは継続して実行されます")

このプログラムを実行すると、以下のような結果が表示されます。

計算でエラーが発生しました
プログラムは継続して実行されます

通常であれば、ゼロで割り算を行うとZeroDivisionErrorが発生してプログラムが停止してしまいます。しかし、try-except文を使うことで、エラーをキャッチして適切なメッセージを表示し、プログラムを継続実行できています。

数値変換でのエラー処理

よくある数値変換の問題

ユーザーからの入力を数値に変換する処理は、エラーが発生しやすい典型的な場面です。

まず、エラー処理を行わない場合の問題を確認してみましょう。

user_input = input("数値を入力してください: ")
number = int(user_input)
result = number * 2
print(f"2倍した結果: {result}")

このプログラムで、ユーザーが「abc」のような文字列を入力すると、ValueErrorが発生してプログラムが停止してしまいます。

try-except文を使った安全な数値変換

今度は、try-except文を使って安全に数値変換を行ってみましょう。

user_input = input("数値を入力してください: ")

try:
    number = int(user_input)
    result = number * 2
    print(f"2倍した結果: {result}")
except:
    print("入力された値は数値ではありません")
    print("次回は数値を入力してください")

このプログラムを実行して、「abc」と入力すると、以下のような結果が表示されます。

数値を入力してください: abc
入力された値は数値ではありません
次回は数値を入力してください

数値(例:「5」)を入力した場合は、以下のような結果が表示されます。

数値を入力してください: 5
2倍した結果: 10

このように、try-except文を使うことで、ユーザーが間違った値を入力してもプログラムが停止せず、分かりやすいメッセージを表示できます。

特定のエラーをキャッチする

エラーの種類を指定する方法

これまでの例では、except:のようにエラーの種類を指定せずに、すべてのエラーをキャッチしていました。しかし、特定の種類のエラーだけをキャッチすることも可能です。

try:
    # エラーが発生する可能性のあるコード
    処理A
except ValueError:
    # ValueErrorが発生した時の処理
    処理B
except ZeroDivisionError:
    # ZeroDivisionErrorが発生した時の処理
    処理C

具体的な例で試してみよう

以下のコードをspecific_error_handling.pyとして作成してみましょう。

user_input = input("数値を入力してください: ")

try:
    number = int(user_input)
    result = 100 / number
    print(f"100を割った結果: {result}")
except ValueError:
    print("数値以外が入力されました")
    print("数字を入力してください")
except ZeroDivisionError:
    print("ゼロで割ることはできません")
    print("ゼロ以外の数値を入力してください")

このプログラムでは、2つの異なるエラーに対してそれぞれ適切なメッセージを表示しています。

「abc」を入力した場合の結果:

数値を入力してください: abc
数値以外が入力されました
数字を入力してください

「0」を入力した場合の結果:

数値を入力してください: 0
ゼロで割ることはできません
ゼロ以外の数値を入力してください

「5」を入力した場合の結果:

数値を入力してください: 5
100を割った結果: 20.0

複数のエラーを同時にキャッチする

複数の種類のエラーに対して同じ処理を行いたい場合は、タプルを使ってまとめて指定できます。

user_input = input("数値を入力してください: ")

try:
    number = int(user_input)
    result = 100 / number
    print(f"100を割った結果: {result}")
except (ValueError, ZeroDivisionError):
    print("正しい数値を入力してください")
    print("ゼロ以外の数字でお願いします")

ユーザーフレンドリーなエラーメッセージ

分かりやすいメッセージの重要性

エラーが発生した時に表示するメッセージは、ユーザーにとって分かりやすいものにすることが大切です。

技術的なエラーメッセージをそのまま表示するのではなく、ユーザーが次に何をすべきかが明確に分かるメッセージを心がけましょう。

改善前と改善後の比較

まず、改善前の例を見てみましょう。

# 改善前:技術的すぎるメッセージ
try:
    age = int(input("年齢を入力してください: "))
    print(f"あなたの年齢は{age}歳ですね")
except ValueError:
    print("ValueError: invalid literal for int()")

次に、改善後の例です。

# 改善後:ユーザーフレンドリーなメッセージ
try:
    age = int(input("年齢を入力してください: "))
    print(f"あなたの年齢は{age}歳ですね")
except ValueError:
    print("年齢は数字で入力してください")
    print("例: 25")

改善後のメッセージでは、ユーザーが具体的に何をすればよいかが明確に示されています。

繰り返し処理と組み合わせた活用

正しい入力があるまで繰り返す

try-except文をwhile文と組み合わせることで、ユーザーが正しい値を入力するまで繰り返し入力を求めることができます。

以下のコードをinput_validation.pyとして作成してみましょう。

while True:
    user_input = input("1から10までの数値を入力してください: ")
    
    try:
        number = int(user_input)
        
        # 範囲の確認
        if 1 <= number <= 10:
            print(f"入力された数値: {number}")
            break  # 正しい入力なのでループを抜ける
        else:
            print("1から10までの数値を入力してください")
            
    except ValueError:
        print("数値を入力してください")

print("入力が完了しました")

このプログラムを実行すると、ユーザーが正しい値を入力するまで繰り返し入力を求めます。

実行例:

1から10までの数値を入力してください: abc
数値を入力してください
1から10までの数値を入力してください: 15
1から10までの数値を入力してください
1から10までの数値を入力してください: 5
入力された数値: 5
入力が完了しました

エラー処理を使った実用的な例

計算機プログラム

try-except文を活用した簡単な計算機プログラムを作成してみましょう。

print("簡単な計算機")
print("2つの数値で割り算を行います")

while True:
    try:
        # 1つ目の数値入力
        num1 = float(input("1つ目の数値を入力してください: "))
        
        # 2つ目の数値入力
        num2 = float(input("2つ目の数値を入力してください: "))
        
        # 計算実行
        result = num1 / num2
        print(f"計算結果: {num1} ÷ {num2} = {result}")
        break
        
    except ValueError:
        print("数値を正しく入力してください")
        print("小数点も使用できます(例: 3.14)")
        
    except ZeroDivisionError:
        print("ゼロで割ることはできません")
        print("2つ目の数値にはゼロ以外を入力してください")

print("計算が完了しました")

このプログラムでは、数値変換エラーとゼロ除算エラーの両方に対応し、ユーザーにとって使いやすい計算機を作成しています。

まとめ

本章では、try-except文を使ったエラー処理について学習しました。

try-except文は、エラーが発生する可能性のあるコードを安全に実行するための重要な仕組みです。tryブロックでエラーが発生すると、exceptブロックの処理が実行され、プログラムの継続実行が可能になります。

特定の種類のエラーだけをキャッチすることで、エラーの原因に応じた適切な対応ができます。また、ユーザーフレンドリーなメッセージを表示することで、使いやすいプログラムを作成できます。

try-except文をwhile文と組み合わせることで、ユーザーが正しい値を入力するまで繰り返し処理を行う、堅牢なプログラムを作成することも可能です。

エラー処理は、実用的なプログラムを作成する上で欠かせない技術です。ユーザーの立場に立って、分かりやすく親切なエラーメッセージを心がけることで、より良いプログラムを作成していきましょう。

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

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

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

作成者:とまだ
Previous
インデックスエラーとキーエラーを理解しよう