Pythonの基本的なエラーについて
この記事を書こうと思った理由とエラーを理解することの重要性について
長いので興味がなければ飛ばしてください。
学校の友人からエラーが起きたから解決方法が知りたいと聞かれることがあるのですが、
だいたい、見に行くとエラーの内容を見ているのではなく、教科書や、サイト、先生が書いたコードと自分のコードをみて間違い探しをしている、という状態です。エラーには原因とどこが間違っているか分かりやすく書いてあるのに...!おそらく、エラー文をよく見ない理由として、英語で書かれていて、ぱっと見だと何を言っているのか分からないというところだと思います。
ですが、エラーはコードの問題を検出し、通知をしてくれる重要なものです。エラーをみて原因を理解して、修正することでよりプログラミングへの理解が深まりエラーが発生しにくいコードを書くことにつながります。エラーが起きたらまずはエラー文を見る、英語で分からなければコピペして翻訳するという習慣はプログラミングをするうえで必須だと思います。とはいえ、取っ掛かりずらいのはとても分かります。そこで今回の記事では、Pythonにおいてよく起きるエラーの種類とエラー文によく出てくる英単語についてまとめてみました。
Pythonのエラー文の見方
トレースバックを読んで場所を特定する
Traceback (most recent call last): の下にどこのファイルの、何行目のどこの部分でエラーが発生しているのかが出力されているため、それを読んで場所を特定する。トレースバックが大量に出力されることもあるが、トレースバックは呼び出し順で出力されるため、上から順にどこが原因か、特定していく。 vscodeの場合 File "ファイル名", line ... の上でctr+クリックで該当箇所を開くことができますエラーの種類を理解する
エラーの種類については次のセクションで解説します。エラーの詳細を理解する
エラーの種類の横にエラーの詳細があるため、それを見る。英語で理解できない場合は翻訳を絶対にする。
よく起こるエラー集
IndentationError
プログラム内のインデント(字下げ)が正しくないときに発生する。
for i in range(10):
print(i)
IndentationError: expected an indented block after 'for' statement on line 1
SyntaxError
プログラムの構文が正しくないときに発生する
例1
print("hello"
print("hello"
^
SyntaxError: '(' was never closed
例2
name = {"name":"kuwaharu"}
print(f"hello{name["name"]}")
print(f"hello{name["name"]}")
^^^^
SyntaxError: f-string: unmatched '['
この例の場合このように修正する必要があります
```python
name = {"name":"kuwaharu"}
print(f"hello{name['name']}")
NameError
定義されていない変数や関数を使用すると発生する
print(f"hello {name}")
print(f"hello {name}")
^^^^
NameError: name 'name' is not defined
TypeError
データ型の不一致によって発生する
a = "abc"
num = 1
print(a + num)
print(a + num)
~~^~~~~
TypeError: can only concatenate str (not "int") to str
'''
ValueError
演算子や関数の処理において、不適切な型を使用した場合に発生する
int("abc")
int("abc")
ValueError: invalid literal for int() with base 10: 'abc'
AttributeError
オブジェクトがプロパティや、メソッドを呼び出す際に、指定されたプロパティやメソッドを持っていない場合に発生する。
これの例ではkuwaharu(Myclass)オブジェクトはageプロパティを持たないためエラーが起きる。
class Myclass:
def __init__(self, name):
self.name = name
kuwaharu = Myclass("kuwaharu")
print(kuwaharu.age)
print(kuwaharu.age)
^^^^^^^^^^^^
AttributeError: 'Myclass' object has no attribute 'age'
この例ではリストオブジェクトはaddメソッドを持たないためエラーが起きる
※正しくは .append
num_list = [1, 2, 3, 4]
num_list.add(5)
num_list.add(5)
^^^^^^^^^^^^
AttributeError: 'list' object has no attribute 'add'
IndexError
存在しないインデックスを参照しようとすると発生する。
よくある原因繰り返し処理の中でリストなどの要素の数を超えてしまうこと
num_list = [0, 1, 2, 3, 4, 5]
for index in range(7):
print(num_list[index])
print(num_list[index])
~~~~~~~~^^^^^^^
IndexError: list index out of range
KeyError
存在しないキーを参照しようとすると発生する。
スペルミスなどが原因のことが多い
test_results = {
"Alice": {"math": 85, "science": 92, "english": 78},
"Bob": {"math": 79, "science": 85, "english": 88},
"Charlie": {"math": 95, "science": 90, "english": 85},
"Diana": {"math": 78, "science": 82, "english": 80},
"Eve": {"math": 88, "science": 89, "english": 92},
}
print(test_results["alice"])
print(test_results["alice"])
~~~~~~~~~~~~^^^^^^^^^
KeyError: 'alice'
ImportError
モジュールのインポートに問題があるときに発生する。
原因としてモジュールが存在しない、名前が衝突している、パスが違うなどがある
よく出てくる英単語
ほとんどChatGPT任せですが...
error: エラー
exception: 例外
failed: 失敗した
invalid: 無効な
missing: 不足している
undefined: 未定義の
unexpected: 予期しない
syntax: 構文
not found: 見つからない
type: 型
out of range: 範囲外
access denied: アクセス拒否
timeout: タイムアウト
deprecated: 非推奨
overflow: オーバーフロー
memory leak: メモリリーク
corrupt: 破損した
unhandled: 処理されない
reference: 参照
permission: 許可
connection: 接続
null: ヌル(null値、値がないこと)
unexpected token: 予期しないトークン
illegal: 不正な
unsupported: サポートされていない
unreachable: 到達不可能な
locked: ロックされた
conflict: 競合
interrupt: 割り込み
segmentation fault: セグメンテーションフォルト(メモリの不正アクセス)
resource: リソース
initialization: 初期化
parse: 解析する
overflow: オーバーフロー
underflow: アンダーフロー
read-only: 読み取り専用
write-only: 書き込み専用
divide by zero: ゼロ除算
stack overflow: スタックオーバーフロー
stack underflow: スタックアンダーフロー
buffer overflow: バッファオーバーフロー
invalid argument: 無効な引数
illegal argument: 不正な引数
out of memory: メモリ不足
assertion: アサーション
file not found: ファイルが見つからない
disk full: ディスク満杯
network: ネットワーク
protocol: プロトコル
hostname: ホスト名
unresolved: 未解決の
duplicate: 重複
この記事が気に入ったらサポートをしてみませんか?