Python実行エラー完全解説:よくあるエラー文と解決方法【事例付き】

 

Pythonプログラミングにおいて、エラーメッセージは初心者にとって最初の大きな壁となることが多いです。しかし、エラーメッセージを正しく理解することで、問題を迅速に解決し、プログラミングスキルを向上させることができます。本記事では、Pythonでよく発生するエラーの種類と具体的な解決方法を、実践的なサンプルコードとともに詳しく解説します。

Pythonエラーの基本構造

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

Pythonのエラーメッセージには、問題を特定するための重要な情報が含まれています。

# エラーが発生するコード例
print(undefined_variable)

# 出力されるエラーメッセージ
# NameError: name 'undefined_variable' is not defined

エラーメッセージの構成要素:

  • エラータイプ: NameError
  • エラー内容: name 'undefined_variable' is not defined
  • 行番号: エラーが発生した場所(通常トレースバックに表示)

構文エラー(SyntaxError)

基本的な構文エラー

Pythonの文法に違反している場合に発生するエラーです。

# 間違い:コロンが不足
if x > 5
    print("大きな数です")

# SyntaxError: invalid syntax

# 正解
if x > 5:
    print("大きな数です")

括弧の不一致

# 間違い:閉じ括弧が不足
result = (10 + 5 * 2

# SyntaxError: unexpected EOF while parsing

# 正解
result = (10 + 5) * 2
print(result)  # 30

クォートの不一致

# 間違い:クォートが閉じられていない
message = "こんにちは、世界

# SyntaxError: EOL while scanning string literal

# 正解
message = "こんにちは、世界"
print(message)

名前エラー(NameError)

未定義変数の使用

変数や関数が定義される前に使用された場合に発生します。

# 間違い:変数が定義されていない
print(user_name)

# NameError: name 'user_name' is not defined

# 正解
user_name = "田中太郎"
print(user_name)

関数名のタイプミス

# 間違い:関数名のスペルミス
def calculate_sum(a, b):
    return a + b

result = calcurate_sum(10, 20)  # スペルミス

# NameError: name 'calcurate_sum' is not defined

# 正解
result = calculate_sum(10, 20)
print(result)  # 30

タイプエラー(TypeError)

不適切なデータ型の操作

# 間違い:文字列と数値の足し算
age = "25"
next_year = age + 1

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

# 正解
age = int("25")
next_year = age + 1
print(next_year)  # 26

関数の引数エラー

# 間違い:引数の数が合わない
def greet(name, age):
    return f"私は{name}、{age}歳です"

message = greet("佐藤")

# TypeError: greet() missing 1 required positional argument: 'age'

# 正解
message = greet("佐藤", 30)
print(message)

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

リストの範囲外アクセス

# 間違い:存在しないインデックスにアクセス
fruits = ["りんご", "バナナ", "オレンジ"]
print(fruits[3])

# IndexError: list index out of range

# 正解
if len(fruits) > 3:
    print(fruits[3])
else:
    print("インデックス3は存在しません")

空のリストへのアクセス

# 間違い:空のリストにアクセス
empty_list = []
first_item = empty_list[0]

# IndexError: list index out of range

# 正解
if empty_list:
    first_item = empty_list[0]
else:
    first_item = None
    print("リストが空です")

キーエラー(KeyError)

辞書の存在しないキーアクセス

# 間違い:存在しないキーにアクセス
user_info = {"name": "山田", "age": 25}
email = user_info["email"]

# KeyError: 'email'

# 正解
email = user_info.get("email", "メールアドレスなし")
print(email)

安全な辞書アクセス方法

user_info = {"name": "山田", "age": 25}

# 方法1: get()メソッドを使用
phone = user_info.get("phone", "未登録")

# 方法2: in演算子で確認
if "email" in user_info:
    email = user_info["email"]
else:
    email = "メールアドレスなし"

値エラー(ValueError)

不適切な値の変換

# 間違い:文字列を数値に変換できない
user_input = "abc"
number = int(user_input)

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

# 正解
user_input = "abc"
try:
    number = int(user_input)
except ValueError:
    print("数値を入力してください")
    number = 0

リストから存在しない値を削除

# 間違い:リストに存在しない値を削除
colors = ["赤", "青", "緑"]
colors.remove("黄")

# ValueError: list.remove(x): x not in list

# 正解
if "黄" in colors:
    colors.remove("黄")
else:
    print("黄色は存在しません")

属性エラー(AttributeError)

存在しないメソッドやプロパティ

# 間違い:文字列に存在しないメソッド
text = "Hello World"
result = text.append("!")

# AttributeError: 'str' object has no attribute 'append'

# 正解
text = "Hello World"
result = text + "!"
print(result)

Noneオブジェクトへのメソッド呼び出し

# 間違い:Noneにメソッドを呼び出し
def get_user():
    return None

user = get_user()
name = user.upper()

# AttributeError: 'NoneType' object has no attribute 'upper'

# 正解
user = get_user()
if user is not None:
    name = user.upper()
else:
    name = "ユーザーなし"

ファイル関連エラー

FileNotFoundError

# 間違い:存在しないファイルを開く
with open("存在しないファイル.txt", "r") as f:
    content = f.read()

# FileNotFoundError: [Errno 2] No such file or directory

# 正解
import os

filename = "data.txt"
if os.path.exists(filename):
    with open(filename, "r") as f:
        content = f.read()
else:
    print(f"{filename}が見つかりません")

PermissionError

# 権限エラーの対処
try:
    with open("protected_file.txt", "w") as f:
        f.write("データ")
except PermissionError:
    print("ファイルへの書き込み権限がありません")

ゼロ除算エラー(ZeroDivisionError)

基本的なゼロ除算

# 間違い:ゼロで割り算
result = 10 / 0

# ZeroDivisionError: division by zero

# 正解
def safe_divide(a, b):
    if b == 0:
        return "ゼロで割ることはできません"
    return a / b

result = safe_divide(10, 0)
print(result)

エラーハンドリングのベストプラクティス

try-except文の活用

def process_user_input(input_str):
    try:
        number = int(input_str)
        result = 100 / number
        return f"結果: {result}"
    except ValueError:
        return "数値を入力してください"
    except ZeroDivisionError:
        return "ゼロは入力できません"
    except Exception as e:
        return f"予期しないエラー: {e}"

# テスト
print(process_user_input("10"))    # 結果: 10.0
print(process_user_input("abc"))   # 数値を入力してください
print(process_user_input("0"))     # ゼロは入力できません

ログを使ったエラー追跡

import logging

logging.basicConfig(level=logging.ERROR)

def divide_numbers(a, b):
    try:
        return a / b
    except ZeroDivisionError as e:
        logging.error(f"ゼロ除算エラー: {e}")
        return None
    except Exception as e:
        logging.error(f"予期しないエラー: {e}")
        return None

result = divide_numbers(10, 0)

デバッグのコツ

print文を使った簡単なデバッグ

def calculate_average(numbers):
    print(f"入力データ: {numbers}")  # デバッグ用
    
    if not numbers:
        print("空のリストです")  # デバッグ用
        return 0
    
    total = sum(numbers)
    count = len(numbers)
    print(f"合計: {total}, 個数: {count}")  # デバッグ用
    
    return total / count

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

例外の詳細情報取得

import traceback

try:
    # エラーが発生するコード
    result = 10 / 0
except Exception as e:
    print(f"エラー発生: {e}")
    print("詳細なトレースバック:")
    traceback.print_exc()

まとめ

Pythonでプログラミングを行う際、エラーは避けて通れない要素です。しかし、エラーメッセージを正しく理解し、適切な対処法を身につけることで、効率的にデバッグを行うことができます。

重要なポイント:

  • エラーメッセージを恐れず、しっかりと読む
  • 各エラータイプの特徴を理解する
  • try-except文を適切に使用する
  • デバッグ用のprint文やログを活用する
  • 予防的なコーディングを心がける

エラーは学習の機会でもあります。今回紹介した事例を参考に、より堅牢なPythonプログラムの作成を目指しましょう。

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>理系出身者向けのPython爆速講座