エラーメッセージの対処法に関する記事
はじめに
プログラミングにおいてエラーメッセージは避けて通れない。熟練したプログラマーになるためには、自分自身でエラーメッセージを読んで解決しなければならない。どのようなエラーメッセージが出たときは何が原因で、どのように対応すれば解決できるのか、その知識や経験の積み重ねこそがプログラミングのスキルを向上させる。
ところが、プログラミング初心者にとってエラーメッセージはただの文字の羅列や意味不明な暗号のように感じられることがほとんどだろう。そこで、今回の記事ではエラーメッセージの読み方について徹底解説する。
理解しておくべき原則
まず、最も理解しておくべき原則はエラーメッセージは意味不明な暗号ではないということだ。実は、エラーメッセージは簡単な英語で書かれていて、決まった英単語や決まった形の文を使いまわしている。それらを覚えたら、知らないエラーメッセージに遭遇したとしてもなんとか解釈できる。
エラーメッセージは読むことができるし、絶対に読むべきである。
エラーを解決する方法
動詞を含む短い文を探す
エラーメッセージの中核を担う部分は動詞を含む短い文である。
- list index out of range
- No module named 'notamodule'
- cannot import name 'cube'
- name 'age' is not defined
このような文章の近くに、エラーが発生したファイルや行番号が指定されていることが大半である。万が一読めない場合でも、Google翻訳で自力で読むようにしよう。実際にこれらをGoogle翻訳にかけると以下のようになる。
- リストのインデックスが範囲外
- 'notamodule'の名前があるモジュールがない
- 'cube'という名前をインポートできない
- 'age'という名前が定義されていない
この時点で対処法がはっきりわかるかもしれない。仮にそうでなくても、言わんとしていることの方向性を理解できるはずだ。
キーワードを検索する
エラーメッセージの対処法として最も有効な方法は、Google検索を使うことだ。短いものであればエラーメッセージをコピペして検索できる。全文をコピペできなければ、エラーメッセージの一部を切り取って検索してみよう。例えば、Pythonの例を考える。
>>> if a < 3
File "<interactive input>", line 1
if a < 3
^
SyntaxError: invalid syntax
上述のエラーメッセージの場合、以下の2つに要素を分けることができる。
- if文でエラーが発生している
- 発生しているエラーの種類が
SyntaxError
補足しておくと、SyntaxError
は文法の誤りが原因で発生するエラーである。上述のプログラムではif文にエラーが出力されているので、Google検索で「Python SyntaxError if」というように検索すればエラーを解決できる内容が書かれている記事にアクセスできるだろう。
ファイル名が書いてある場合、そのファイルに原因がある
これは至って当然だが、エラーメッセージにファイル名が出ている場合、そのファイル名に問題がある。行番号が指定されているなら、ほとんどの場合はその行にエラーがある。
次にやるべきことは、その部分や周囲に間違っている部分がないか探そう。上で見つけた文と合わせれば、どう間違っていてどのように解決するのかすぐに分かる場合が多い。このとき、if
やbefore
というような位置を表現する前置詞にも注目する。
長いエラーメッセージは上から順番に読む
万が一、エラーメッセージが大量に出力されたとしても慌てふためく必要はない。コンパイラはソースコードを上から順番に読む。すると、ソースコードの上の方で見つかったエラーほど先に報告するので、エラーメッセージの上に表示されることになる。エラーは上から順番に対処するべきである。
何をすればエラーメッセージが出てくる、でなくなるのかを見極める
エラーがある箇所はなんとなくわかるものの、直し方の検討がつかない場合は該当の部分を取り除いてエラーが出なくなるかどうかを確認する。このやり方でエラーが出力されなければ詳細に調べる必要があるし、何か別のエラーが出力された場合はそれを先に修正する。
エラーを再現する小さなプログラムを書く
エラーが発生する箇所だけを取り出して、そのエラーが出力されるようなできるだけ小さいプログラムを新しく作る。そして、以下の観点に留意しながらエラーを分析する。
- 抜き出したプログラム
- そのプログラムで出力されたエラーメッセージ
- エラーメッセージの種類
- エラーが発生したファイル名とプログラムファイルの行数
この方法は、巨大なプログラムを書いている場合に有効である。エラーの原因に焦点を当てられるので、結果的にエラーを解決しやすくなる。
プログラムの動作の流れを追いかける
コンパイルする際にエラーメッセージが出力する場合は問題ないのだが、コンパイルは通ったのに実行すればエラーが出力されることも少なくない。PythonやRubyのようなスクリプト言語ならなおさらである。
その場合、プログラムが実際にどのように動作しているのか、どのようなコードがどういう順番で動作しているのかを把握することでエラーの原因を特定しやすい。プログラムを動かしてみてエラーの原因を探る作業をデバッグ(debug)と呼ぶ。
デバッグのやり方には、以下のようなものがある。
-
組み込み関数や専用のを使う:JavaScriptなら
console
、Pythonであればlogging
等の組み込み関数を使ってデバッグする。やりかたは本記事では割愛。 - デバッガを使う:プログラムの実行を途中で止めたり、変数の値をチェックしたりできるプログラム。Visual Studio等のIDE(統合開発環境)と呼ばれるエディタを使っているならば、標準でデバッガが搭載されていることが多い。
大きなプログラムをデバッグするのは大変だが、小さなプログラムなら多少デバッグしやすい。
英語で検索する
ITやプログラミング・エンジニアリングに関連する情報は日本語よりも英語のほうが圧倒的に多い。Wordtipsの記事によれば、英語話者は11億人以上いることが判明している。これは、日本の総人口のおおよそ11倍以上である。当然、日本語の情報よりも英語の情報が圧倒的に多い。
日本語でエラーに対する対処法を解説したページが全然見つからない場合でも、英語で検索すれば、ほとんどの場合何らかの情報が見つかるのだ。エラーメッセージは英語で書かれている。自力でエラーを解決するためには、Google翻訳やDeepLをフル活用して自力で読み解く練習をしよう。
サンプルコードを見つけても、何も考えずにコピペしないこと
Google検索でサンプルコードを発見しても、そのコードが行っている処理や動く仕組みを自分で考えて、それに基づいて自分のコードを書き直そう。
どうしても解決しないときは誰かに質問する
どうしてもエラーを解決できない場合は誰かに質問しよう。身近に質問できる人がいない場合はStack Overflow等の質問サイトをフル活用しよう。
質問する時の注意点
熟練したプログラマは、エラーメッセージの中からあなたが見逃した部分にしっかり気づいて、対処方法を教えてくれる。その中で、質問する際の注意点を箇条書きで簡潔に示す。
- 質問する前に調べる:質問する前に、再度Google検索しよう。自分がぶつかっている問題の解決策が、すでにGoogle検索でヒットすることはよくある。
- エラーメッセージは原文通りに貼り付けて、質問者の実行環境とバージョンを詳細に記述する:エラーを解決する上でもっとも重要なことは「再現性」。どのようにすればそのエラーを再現できるのかを他の人に的確に伝えることができれば、その解決方法を模索してくれる。的確なフィードバックや解決策を得るためにも、実行環境とエラーメッセージは正確に記載しよう。
- 自分で解決した場合はその解決方法を書く:どのようにすれば解決するのかをソースコードやスクリーンショットで詳細に解説する。そうすることで、似たようなエラーが出力された場合のヒントになる。「解決しました」と書いて去ることは絶対にやめるべき。
- 回答してくれた人に感謝する:質問に回答してもらうことは当たり前の行動ではない。貴重な時間を割いてくれたことに対する感謝の気持ちを一言でもいいので述べておこう。
おわりに
今回の記事では、エラーメッセージの対処法を徹底解説した。1つでも参考になるものがあれば幸いである。
Discussion