KeyError / IndexError を最小再現で切り分ける──辞書とリストの「存在しない添字」を潰す
KeyError と IndexError は、メッセージの見た目は違うが、「容れ物[添字]の添字が容れ物に存在しなかった」という同じ構造のエラーだ。KeyError: 'port' なら辞書にキー port が無く、IndexError: list index out of range ならリストの位置が範囲外にある。この記事では、エラー名で辞書かリストかを見分け、Python 3.11 以降で表示されるキャレット(~~~^^^)で犯人の添字式を特定し、最小再現に落として潰す手順を解説している。掲載コードと出力は Python 3.11 で実行して確認済みだという。
面白いのは、このエラーが「何が無かったか」をどこまで教えてくれるかの違いだ。KeyError は無かったキーの名前がそのままメッセージに出るので、切り分けは速い。一方 IndexError は、何番目が範囲外かを教えてくれない。記事の例では「alice,30,tokyo」は成功するのに「bob,25」で落ちる。同じ関数が入力によって壊れるという事実こそが、IndexError の正体だ。列数の思い込みは、データを一行ずつ分解する業務で何度でも踏まれる罠であり、エラーの文面を読むより、落ちた入力を控えて再現させる作業の方が効く。デバッガを開く前に、再現する入力を1つ手元に残すことを優先すべきだ。
中小企業の現場で言えば、このエラーは「CSVや設定ファイルに1行だけ抜けた行がある」というトラブルの典型だ。辞書の必須キーは in で存在を確かめて分かりやすいエラーにし、任意の項目は get で既定値を入れる。リストは長さを確かめてから取り出す。社内で動いているスクリプトにこの2つの防御を入れるだけで、夜中に止まる回数は減らせる。ただし d["key"] は「あるべきキーが無ければバグ」という前提を守らせる書き方として健全で、すべて get に置き換えると設定漏れを黙って既定値で流すことになる。どちらを使うかは、そのキーが無いのが正常かどうかで決めるべきだ。
※ 上記は配信元記事をもとにAIの鬼編集部が要約・再構成したものです。正確な内容は出典元をご確認ください。
このニュースの全文は、配信元でお読みいただけます。 Zenn AIで元記事を読む →


