ステップ21:エラーと例外処理

🛡️ ステップ21: エラーと例外処理

エラーを正しく理解して、プログラムを強くしよう!

プログラミングをしていると、必ずエラーに遭遇します。でも、エラーは怖いものではありません!エラーは「何か間違っているよ」と教えてくれる親切なメッセージなんです。

📖 このステップで学ぶこと

・エラーの種類と読み方

・try-except構文の使い方

・else と finally の活用

・デバッグの基本テクニック

🎯 1. エラーって何?

🔰 エラーの2つの種類

Pythonのエラーは、大きく2種類に分けられます:

📌 エラーの種類

種類 意味 いつ起きる?
構文エラー(Syntax Error) プログラムの書き方が間違っている プログラム実行前
例外(Exception) 書き方は正しいが、実行中に問題発生 プログラム実行中

💡 エラーとの付き合い方

・エラーは恐れるものではなく、学ぶもの

・エラーメッセージを読めば、何が問題か分かる

・エラーと上手に付き合うことが、プログラマーへの第一歩!

⚠️ 2. よくあるエラーの種類

プログラミングでよく遭遇するエラーを見ていきましょう。

📝 SyntaxError(構文エラー)

プログラムの書き方が間違っている時に出るエラーです。

例:コロンを忘れた

※スマートフォンでは横スクロールできます

# if文の後にコロン(:)がない → エラー
if True
    print("Hello")

❌ エラーメッセージ

SyntaxError: expected ':'

原因:if文の後にコロン(:)を忘れています

解決if True: と書く

📝 NameError(名前エラー)

定義していない変数や関数を使おうとした時のエラーです。

例:変数が定義されていない

※スマートフォンでは横スクロールできます

# hello という変数は定義していない
print(hello)

❌ エラーメッセージ

NameError: name 'hello' is not defined

原因:変数 hello が定義されていない

解決hello = "こんにちは" と先に定義する、または print("hello") と文字列にする

📝 TypeError(型エラー)

データ型が合わない操作をした時のエラーです。

例:文字列と数値を足そうとした

※スマートフォンでは横スクロールできます

# 文字列 "10" と 整数 5 は足し算できない
result = "10" + 5

❌ エラーメッセージ

TypeError: can only concatenate str (not "int") to str

原因:文字列と整数は足し算できない

解決int("10") + 5(文字列を整数に変換)または "10" + str(5)(整数を文字列に変換)

📝 ValueError(値エラー)

関数に不適切な値を渡した時のエラーです。

例:数値に変換できない文字列

※スマートフォンでは横スクロールできます

# "abc" は数値に変換できない
number = int("abc")

❌ エラーメッセージ

ValueError: invalid literal for int() with base 10: 'abc'

原因:”abc” は整数に変換できない

解決:数字だけの文字列(例:”123″)を渡す、またはtry-exceptでエラーを処理

📝 IndexError(インデックスエラー)

リストの範囲外を参照した時のエラーです。

例:存在しないインデックス

※スマートフォンでは横スクロールできます

fruits = ["りんご", "バナナ"]  # インデックスは 0 と 1 のみ
print(fruits[5])  # インデックス 5 は存在しない

❌ エラーメッセージ

IndexError: list index out of range

原因:リストの範囲外のインデックスを指定した

解決len(fruits) でリストの長さを確認してからアクセス

📝 KeyError(キーエラー)

辞書に存在しないキーを参照した時のエラーです。

例:存在しないキー

※スマートフォンでは横スクロールできます

person = {"name": "太郎", "age": 15}
print(person["hobby"])  # "hobby" というキーは存在しない

❌ エラーメッセージ

KeyError: 'hobby'

原因:辞書に ‘hobby’ というキーが存在しない

解決person.get("hobby", "なし") でデフォルト値を指定、または "hobby" in person で存在確認

📝 ZeroDivisionError(ゼロ除算エラー)

0で割り算をしようとした時のエラーです。

例:0で割る

※スマートフォンでは横スクロールできます

# 数学的に 0 で割ることはできない
result = 10 / 0

❌ エラーメッセージ

ZeroDivisionError: division by zero

原因:0で割ることはできない

解決:割る前に if b != 0: で0でないことを確認

📌 よくあるエラーのまとめ

エラー 原因 よくあるケース
SyntaxError 書き方の間違い コロン忘れ、括弧の閉じ忘れ
NameError 未定義の変数 変数名のタイプミス
TypeError 型の不一致 文字列と数値の演算
ValueError 不適切な値 int(“abc”)
IndexError 範囲外のインデックス リスト[存在しない番号]
KeyError 存在しないキー 辞書[“存在しないキー”]
ZeroDivisionError 0で割る 10 / 0

🛡️ 3. try-except構文 – エラーを処理する

try-except構文を使うと、エラーが起きてもプログラムを止めずに処理を続けられます。

🔰 try-exceptとは

「試してみて(try)、エラーが起きたら対処する(except)」という仕組みです。

📝 try-except の構文

try:

# エラーが起きるかもしれない処理

except エラーの種類:

# エラーが起きた時の処理

📝 基本的な使い方

完成コード:数字の入力を安全に処理

※スマートフォンでは横スクロールできます

# try-except を使わない場合
# "abc" と入力すると ValueError でプログラムが停止してしまう

# try-except を使う場合
try:
    # エラーが起きるかもしれない処理を try の中に書く
    number = int(input("数字を入力: "))
    print(f"入力された数字: {number}")
except:
    # エラーが起きた時に実行される処理
    print("エラー: 数字を入力してください")

実行結果(”abc” と入力した場合)

数字を入力: abc
エラー: 数字を入力してください

💡 try-exceptのメリット

・エラーが起きてもプログラムが停止しない

・ユーザーに分かりやすいエラーメッセージを表示できる

・エラー発生後も処理を続行できる

📝 特定のエラーだけ処理する

exceptの後にエラーの種類を指定すると、そのエラーだけを処理できます。

完成コード:複数のエラーを個別に処理

※スマートフォンでは横スクロールできます

try:
    number = int(input("数字を入力: "))
    result = 100 / number
    print(f"100 ÷ {number} = {result}")

except ValueError:
    # "abc" など数字以外を入力した時
    print("エラー: 数字を入力してください")

except ZeroDivisionError:
    # 0 を入力した時
    print("エラー: 0では割れません")

実行結果(0 を入力した場合)

数字を入力: 0
エラー: 0では割れません

実行結果(5 を入力した場合)

数字を入力: 5
100 ÷ 5 = 20.0

📝 複数のエラーをまとめて処理

複数のエラーを同じ方法で処理したい場合は、タプルで指定できます。

完成コード:複数のエラーをまとめて処理

※スマートフォンでは横スクロールできます

numbers = [10, 20, 30]

try:
    index = int(input("インデックス(0-2): "))
    print(f"値: {numbers[index]}")

except (ValueError, IndexError):
    # ValueError と IndexError を同じメッセージで処理
    print("エラー: 0から2の数字を入力してください")

実行結果(5 を入力した場合)

インデックス(0-2): 5
エラー: 0から2の数字を入力してください

📝 エラーメッセージを取得する(as)

asを使うと、エラーの詳細なメッセージを取得できます。

完成コード:エラーメッセージを表示

※スマートフォンでは横スクロールできます

try:
    number = int(input("数字を入力: "))

except ValueError as e:
    # e にはエラーの詳細メッセージが入る
    print(f"エラーが発生しました")
    print(f"詳細: {e}")

実行結果(”abc” と入力した場合)

数字を入力: abc
エラーが発生しました
詳細: invalid literal for int() with base 10: 'abc'

💡 as e の使いどころ

・デバッグ時に詳細なエラー情報を知りたい時

・ログファイルにエラー情報を記録する時

・ユーザーには分かりやすいメッセージを表示しつつ、開発者用に詳細を残す時

📝 全てのエラーを処理する(Exception)

Exceptionを使うと、すべての例外を処理できます。

完成コード:全てのエラーをキャッチ

※スマートフォンでは横スクロールできます

try:
    # 何らかの処理
    number = int(input("数字を入力: "))
    result = 100 / number
    print(f"結果: {result}")

except ValueError:
    print("エラー: 数字を入力してください")

except ZeroDivisionError:
    print("エラー: 0では割れません")

except Exception as e:
    # 上記以外の予期しないエラーをキャッチ
    print(f"予期しないエラーが発生しました: {e}")

⚠️ except: だけは避けよう

except: だけ書くと、どんなエラーでも処理してしまいます。

これは便利に見えますが、予期しないエラーを見逃す原因になります。

具体的なエラーの種類を指定するか、except Exception as e: を使いましょう。

🔄 4. else と finally

try-except には、elsefinally という追加のブロックがあります。

📝 else – エラーが起きなかった時だけ実行

else ブロックは、try ブロック内でエラーが起きなかった時だけ実行されます。

📝 try-except-else の構文

try:

# エラーが起きるかもしれない処理

except エラーの種類:

# エラーが起きた時の処理

else:

# エラーが起きなかった時の処理

完成コード:elseの使い方

※スマートフォンでは横スクロールできます

try:
    number = int(input("数字を入力: "))

except ValueError:
    # エラーが起きた時
    print("エラー: 数字を入力してください")

else:
    # エラーが起きなかった時だけ実行される
    print(f"正常に入力されました: {number}")
    print(f"2倍すると: {number * 2}")

実行結果(42 を入力した場合)

数字を入力: 42
正常に入力されました: 42
2倍すると: 84

実行結果(”abc” を入力した場合)

数字を入力: abc
エラー: 数字を入力してください

💡 elseを使うメリット

・エラーが起きなかった時だけ実行したい処理を明確に分けられる

・tryブロックを最小限に保てる(エラーが起きる可能性のある処理だけをtryに入れる)

📝 finally – 必ず実行される

finally ブロックは、エラーがあってもなくても必ず実行されます。

📝 try-except-finally の構文

try:

# エラーが起きるかもしれない処理

except エラーの種類:

# エラーが起きた時の処理

finally:

# 必ず実行される処理(エラーがあってもなくても)

完成コード:finallyの使い方

※スマートフォンでは横スクロールできます

try:
    filename = input("ファイル名: ")
    file = open(filename, "r", encoding="utf-8")
    content = file.read()
    print(content)

except FileNotFoundError:
    print(f"エラー: {filename} が見つかりません")

finally:
    # エラーがあってもなくても必ず実行される
    print("処理を終了します")

実行結果(存在しないファイルを指定した場合)

ファイル名: test.txt
エラー: test.txt が見つかりません
処理を終了します

💡 finallyを使う場面

・ファイルを閉じる処理

・データベース接続を閉じる処理

・「処理終了」のメッセージを表示

・クリーンアップ(後片付け)処理

📝 完全な形(try-except-else-finally)

すべてを組み合わせた完全な形を見てみましょう。

完成コード:try-except-else-finally

※スマートフォンでは横スクロールできます

try:
    # エラーが起きるかもしれない処理
    number = int(input("数字を入力: "))
    result = 100 / number

except ValueError:
    # 数字以外を入力した時
    print("エラー: 数字を入力してください")

except ZeroDivisionError:
    # 0を入力した時
    print("エラー: 0では割れません")

else:
    # エラーが起きなかった時だけ実行
    print(f"100 ÷ {number} = {result}")

finally:
    # 必ず実行される
    print("計算処理を終了します")

実行結果(5 を入力した場合 – 正常)

数字を入力: 5
100 ÷ 5 = 20.0
計算処理を終了します

実行結果(0 を入力した場合 – エラー)

数字を入力: 0
エラー: 0では割れません
計算処理を終了します

📌 try-except-else-finally の実行順序

ブロック いつ実行される?
try 最初に必ず実行(エラーが起きたら途中で中断)
except tryでエラーが起きた時だけ実行
else tryでエラーが起きなかった時だけ実行
finally 必ず最後に実行(エラーがあってもなくても)

🎯 5. 実践的な例

ここまで学んだことを使って、実際に役立つプログラムを作ってみましょう。

📝 実践例1:安全な入力処理(再入力を求める)

正しい値が入力されるまで繰り返し入力を求めます。

完成コード:正しい入力が得られるまで繰り返す

※スマートフォンでは横スクロールできます

def get_int_input(prompt):
    """整数が入力されるまで繰り返す関数"""
    while True:
        try:
            # 入力を試みる
            value = int(input(prompt))
            return value  # 成功したら値を返す
        except ValueError:
            # エラーが起きたらメッセージを表示して再度ループ
            print("エラー: 整数を入力してください")

# 使用例
age = get_int_input("年齢を入力: ")
print(f"年齢: {age}歳")

実行結果

年齢を入力: abc
エラー: 整数を入力してください
年齢を入力: 二十歳
エラー: 整数を入力してください
年齢を入力: 20
年齢: 20歳

📝 実践例2:範囲チェック付き入力

指定した範囲の数値が入力されるまで繰り返します。

完成コード:範囲チェック付き入力

※スマートフォンでは横スクロールできます

def get_int_in_range(prompt, min_val, max_val):
    """指定範囲の整数が入力されるまで繰り返す関数"""
    while True:
        try:
            value = int(input(prompt))
            
            # 範囲チェック
            if min_val <= value <= max_val:
                return value
            else:
                print(f"エラー: {min_val}から{max_val}の間で入力してください")
        
        except ValueError:
            print("エラー: 整数を入力してください")

# 使用例:1から10の数字を入力
number = get_int_in_range("1から10の数字: ", 1, 10)
print(f"入力された数字: {number}")

実行結果

1から10の数字: 15
エラー: 1から10の間で入力してください
1から10の数字: 5
入力された数字: 5

📝 実践例3:安全なファイル読み込み

ファイルの存在確認とエラー処理を組み合わせた関数です。

完成コード:安全なファイル読み込み関数

※スマートフォンでは横スクロールできます

def read_file_safe(filename):
    """安全にファイルを読み込む関数"""
    try:
        with open(filename, "r", encoding="utf-8") as file:
            return file.read()
    
    except FileNotFoundError:
        print(f"エラー: {filename} が見つかりません")
        return None
    
    except PermissionError:
        print(f"エラー: {filename} を読む権限がありません")
        return None
    
    except Exception as e:
        print(f"予期しないエラー: {e}")
        return None

# 使用例
content = read_file_safe("sample.txt")

if content is not None:
    print("=== ファイルの内容 ===")
    print(content)
else:
    print("ファイルを読み込めませんでした")

実行結果(ファイルが存在しない場合)

エラー: sample.txt が見つかりません
ファイルを読み込めませんでした

📝 実践例4:安全な辞書アクセス

辞書のキーが存在しない場合にデフォルト値を返す関数です。

完成コード:安全な辞書アクセス

※スマートフォンでは横スクロールできます

def get_value_safe(dictionary, key, default=None):
    """辞書から安全に値を取得する関数"""
    try:
        return dictionary[key]
    except KeyError:
        print(f"警告: キー '{key}' が見つかりません")
        return default

# 使用例
person = {"name": "太郎", "age": 15}

name = get_value_safe(person, "name")
hobby = get_value_safe(person, "hobby", "なし")

print(f"名前: {name}")
print(f"趣味: {hobby}")

実行結果

警告: キー 'hobby' が見つかりません
名前: 太郎
趣味: なし

💡 ヒント:dict.get()メソッド

実は、辞書にはget()メソッドがあり、同様のことができます:

hobby = person.get("hobby", "なし")

キーが存在しなくてもエラーにならず、第2引数のデフォルト値が返されます。

📝 実践例5:エラー処理付き計算機

四則演算ができる計算機で、様々なエラーを処理します。

完成コード:計算機

※スマートフォンでは横スクロールできます

def calculator():
    """エラー処理付きの計算機"""
    try:
        # 入力を受け取る
        num1 = float(input("1つ目の数字: "))
        operator = input("演算子(+, -, *, /): ")
        num2 = float(input("2つ目の数字: "))
        
        # 演算を実行
        if operator == "+":
            result = num1 + num2
        elif operator == "-":
            result = num1 - num2
        elif operator == "*":
            result = num1 * num2
        elif operator == "/":
            result = num1 / num2
        else:
            print("エラー: 無効な演算子です")
            return
        
        print(f"結果: {num1} {operator} {num2} = {result}")
    
    except ValueError:
        print("エラー: 数字を入力してください")
    except ZeroDivisionError:
        print("エラー: 0で割ることはできません")
    except Exception as e:
        print(f"予期しないエラー: {e}")

# 計算機を実行
calculator()

実行結果(正常な計算)

1つ目の数字: 10
演算子(+, -, *, /): *
2つ目の数字: 5
結果: 10.0 * 5.0 = 50.0

実行結果(0で割る)

1つ目の数字: 10
演算子(+, -, *, /): /
2つ目の数字: 0
エラー: 0で割ることはできません

📖 6. エラーメッセージの読み方

エラーメッセージには、問題を解決するためのヒントがたくさん含まれています。読み方を覚えましょう。

📝 エラーメッセージの構造

Pythonのエラーメッセージは、以下の構造になっています:

※スマートフォンでは横スクロールできます

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    result = 10 / 0
ZeroDivisionError: division by zero

📌 エラーメッセージの読み方

部分 内容
ファイル名 どのファイルでエラーが起きたか File “test.py”
行番号 何行目でエラーが起きたか line 3
問題のコード エラーが起きた行のコード result = 10 / 0
エラーの種類 どんなエラーか ZeroDivisionError
エラーの説明 詳しい原因 division by zero(0で割った)

📝 複数の関数がある場合(トレースバック)

関数の中で関数を呼び出している場合、エラーの発生場所を追跡できます。

エラーが起きるコード

※スマートフォンでは横スクロールできます

def divide(a, b):
    return a / b

def calculate():
    result = divide(10, 0)
    return result

calculate()

エラーメッセージ

※スマートフォンでは横スクロールできます

Traceback (most recent call last):
  File "test.py", line 8, in <module>
    calculate()
  File "test.py", line 5, in calculate
    result = divide(10, 0)
  File "test.py", line 2, in divide
    return a / b
ZeroDivisionError: division by zero

💡 トレースバックの読み方

トレースバックは下から上に読むのがコツです:

1. 一番下:実際にエラーが起きた場所(return a / b

2. その上:そこを呼び出した場所(divide(10, 0)

3. さらに上:その関数を呼び出した場所(calculate()

🔍 7. デバッグの基本

「デバッグ」とは、プログラムのバグ(エラーや不具合)を見つけて修正することです。

📝 デバッグ方法1:print文で確認

最もシンプルで効果的な方法は、print()で変数の値を確認することです。

完成コード:print文でデバッグ

※スマートフォンでは横スクロールできます

def calculate_average(numbers):
    # デバッグ:引数を確認
    print(f"デバッグ: numbers = {numbers}")
    
    total = sum(numbers)
    # デバッグ:合計を確認
    print(f"デバッグ: total = {total}")
    
    count = len(numbers)
    # デバッグ:個数を確認
    print(f"デバッグ: count = {count}")
    
    average = total / count
    return average

result = calculate_average([10, 20, 30])
print(f"平均: {result}")

実行結果

デバッグ: numbers = [10, 20, 30]
デバッグ: total = 60
デバッグ: count = 3
平均: 20.0

📝 デバッグ方法2:assert文(アサーション)

assert文を使うと、「この条件は満たされているはず」という前提をチェックできます。

完成コード:assert文でチェック

※スマートフォンでは横スクロールできます

def divide(a, b):
    # b が 0 でないことをチェック
    # 条件がFalseの場合、AssertionError が発生
    assert b != 0, "0で割ることはできません"
    
    return a / b

# 正常な場合
result = divide(10, 2)
print(f"10 / 2 = {result}")

# エラーになる場合(コメントを外すとAssertionError)
# result = divide(10, 0)

実行結果

10 / 2 = 5.0

📝 assert の構文

assert 条件, "エラーメッセージ"

条件がFalseの場合、AssertionError が発生してプログラムが停止します。

📝 デバッグのコツ

📌 デバッグの5つのコツ

コツ 説明
1. エラーメッセージをよく読む ファイル名、行番号、エラーの種類を確認
2. print文で変数の値を確認 期待した値になっているか確認
3. 小さい部分から動作確認 全体ではなく、部分ごとにテスト
4. コメントアウトで原因を絞る 1行ずつコメントアウトして、どこでエラーが起きるか特定
5. エラーメッセージで検索 Googleでエラーメッセージを検索すると解決策が見つかることが多い

📝 練習問題(10問)

ここまで学んだことを実際に手を動かして確認しましょう。

問題1:基本的なtry-except(初級)

📋 問題

数字を入力してもらい、入力が数字でない場合は「数字を入力してください」と表示しましょう。

解答を見る

コード

※スマートフォンでは横スクロールできます

try:
    number = int(input("数字を入力: "))
    print(f"入力: {number}")
except ValueError:
    print("数字を入力してください")

問題2:ゼロ除算の処理(初級)

📋 問題

2つの数字を入力してもらい、割り算をしましょう。0で割ろうとした場合はエラーメッセージを表示します。

解答を見る

コード

※スマートフォンでは横スクロールできます

try:
    a = float(input("割られる数: "))
    b = float(input("割る数: "))
    result = a / b
    print(f"結果: {result}")
except ZeroDivisionError:
    print("エラー: 0で割ることはできません")
except ValueError:
    print("エラー: 数字を入力してください")

問題3:リストの範囲チェック(初級)

📋 問題

リスト[10, 20, 30]からインデックスを指定して要素を取得しましょう。範囲外の場合はエラーメッセージを表示します。

解答を見る

コード

※スマートフォンでは横スクロールできます

numbers = [10, 20, 30]

try:
    index = int(input("インデックス(0-2): "))
    print(f"値: {numbers[index]}")
except IndexError:
    print("エラー: 範囲外です")
except ValueError:
    print("エラー: 数字を入力してください")

問題4:正の数が入力されるまで繰り返す(中級)

📋 問題

正の数が入力されるまで繰り返し入力を求めるプログラムを作りましょう。

解答を見る

コード

※スマートフォンでは横スクロールできます

while True:
    try:
        number = int(input("正の数を入力: "))
        if number > 0:
            print(f"入力: {number}")
            break
        else:
            print("正の数を入力してください")
    except ValueError:
        print("エラー: 整数を入力してください")

問題5:辞書のキーチェック(中級)

📋 問題

辞書からキーを指定して値を取得しましょう。キーが存在しない場合は「見つかりません」と表示します。

解答を見る

コード

※スマートフォンでは横スクロールできます

person = {"name": "太郎", "age": 15, "city": "東京"}

key = input("キーを入力: ")

try:
    value = person[key]
    print(f"{key}: {value}")
except KeyError:
    print("見つかりません")

問題6:ファイル読み込みの安全処理(中級)

📋 問題

ファイル名を入力してもらい、ファイルを読み込みましょう。ファイルが存在しない場合はエラーメッセージを表示します。

解答を見る

コード

※スマートフォンでは横スクロールできます

filename = input("ファイル名: ")

try:
    with open(filename, "r", encoding="utf-8") as file:
        content = file.read()
        print(content)
except FileNotFoundError:
    print(f"エラー: {filename} が見つかりません")

問題7:else句の活用(中級)

📋 問題

数字を入力してもらい、その2乗を計算しましょう。エラーがなければ「計算成功」と表示します。

解答を見る

コード

※スマートフォンでは横スクロールできます

try:
    number = int(input("数字を入力: "))
except ValueError:
    print("エラー: 数字を入力してください")
else:
    result = number ** 2
    print(f"{number}の2乗は{result}です")
    print("計算成功")

問題8:安全な割り算関数(上級)

📋 問題

2つの数を受け取り、割り算の結果を返す関数を作りましょう。エラーが起きた場合はNoneを返します。

解答を見る

コード

※スマートフォンでは横スクロールできます

def safe_divide(a, b):
    try:
        return a / b
    except ZeroDivisionError:
        print("エラー: 0で割ることはできません")
        return None
    except TypeError:
        print("エラー: 数値を入力してください")
        return None

result = safe_divide(10, 2)
print(f"結果: {result}")

result = safe_divide(10, 0)
print(f"結果: {result}")

問題9:finally句の活用(上級)

📋 問題

ファイルを開いて処理し、最後に「処理完了」と必ず表示するプログラムを作りましょう。

解答を見る

コード

※スマートフォンでは横スクロールできます

filename = input("ファイル名: ")

try:
    with open(filename, "r", encoding="utf-8") as file:
        lines = file.readlines()
        print(f"行数: {len(lines)}")
except FileNotFoundError:
    print(f"エラー: {filename} が見つかりません")
except Exception as e:
    print(f"エラー: {e}")
finally:
    print("処理完了")

問題10:複数のエラーを処理する計算機(上級)

📋 問題

四則演算ができる計算機を作りましょう。すべての考えられるエラーを処理します。

解答を見る

コード

※スマートフォンでは横スクロールできます

try:
    num1 = float(input("1つ目の数: "))
    operator = input("演算子(+,-,*,/): ")
    num2 = float(input("2つ目の数: "))
    
    if operator == "+":
        result = num1 + num2
    elif operator == "-":
        result = num1 - num2
    elif operator == "*":
        result = num1 * num2
    elif operator == "/":
        result = num1 / num2
    else:
        print("エラー: 無効な演算子")
        result = None
    
    if result is not None:
        print(f"結果: {result}")

except ValueError:
    print("エラー: 数字を入力してください")
except ZeroDivisionError:
    print("エラー: 0で割れません")
except Exception as e:
    print(f"予期しないエラー: {e}")

❓ よくある質問

Q1: try-exceptは必ず使うべき?

エラーが予想される場所では使うべきです。特に以下の場面では必須:

・ユーザーからの入力(数字を期待しているのに文字列が入力されるなど)

・ファイル操作(ファイルが存在しない可能性)

・ネットワーク通信(接続できない可能性)

・外部データの処理(想定外の形式のデータ)

Q2: except: だけ書いてもいい?

動きますが、推奨されません

理由:

・どのエラーを処理しているか分からなくなる

・予期しないエラーを見逃す原因になる

・デバッグが難しくなる

具体的なエラーの種類を指定するか、except Exception as e: を使いましょう。

Q3: elseとfinallyの違いは?

else:エラーが起きなかった時だけ実行

finally:エラーがあってもなくても必ず実行

使い分けの例:

・else:正常時の追加処理(「計算成功」のメッセージなど)

・finally:後片付け処理(ファイルを閉じる、「処理終了」のメッセージなど)

Q4: エラーメッセージが英語で読めない…

エラーメッセージをそのままGoogle検索すると、同じエラーの解決方法が見つかることが多いです。

また、以下の単語を覚えておくと便利:

・not defined → 定義されていない

・invalid → 無効な

・out of range → 範囲外

・division by zero → ゼロで割った

慣れれば英語でも読めるようになります!

Q5: デバッグのprint文は消すべき?

・開発中は残しておいてOK

・完成したら消すか、コメントアウトしましょう

・本格的なプロジェクトでは、loggingモジュールを使うと良いでしょう

(loggingを使うと、ログレベルでメッセージの出力を制御できます)

📌 try-exceptを使うべき場面

場面 予想されるエラー
ユーザー入力(数字を期待) ValueError
ファイル読み込み FileNotFoundError
リストへのアクセス IndexError
辞書へのアクセス KeyError
割り算 ZeroDivisionError
型変換 TypeError, ValueError

🎉 ステップ21のまとめ

✅ このステップで学んだこと

エラーの種類:SyntaxError、NameError、TypeError、ValueError、IndexError、KeyError、ZeroDivisionError

try-except:エラーを処理してプログラムを止めない

else:エラーが起きなかった時だけ実行

finally:必ず実行される(後片付け処理)

as e:エラーメッセージを取得

デバッグ:print文、assert文、エラーメッセージの読み方

📌 このステップで学んだ主な構文

構文 用途
try: ... except: 基本的なエラー処理
except ErrorType: 特定のエラーだけ処理
except (Error1, Error2): 複数のエラーをまとめて処理
except ErrorType as e: エラーメッセージを取得
else: エラーがなかった時の処理
finally: 必ず実行する処理
assert 条件, メッセージ 条件をチェック(デバッグ用)

💪 次のステップへ

エラーと例外処理をマスターしました!

これで、プログラムが予期しないエラーに遭遇しても、適切に対処できるようになりました。

モジュールとファイル編はここまでです。

次のステップからは、「オブジェクト指向入門編」に入ります。

クラスの基礎を学び、より本格的なプログラミングに挑戦しましょう!

📝

学習メモ

Pythonプログラミング基礎 - Step 21

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE