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駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。


