エラーメッセージの読み方事典
104件のエラーメッセージを、意味・原因・対処の順で解きました。
直す命令には代償があります。git reset --hard はコミットしていない作業を捨て、強制プッシュは他人のコミットを消し、docker system prune は名前のないボリュームを削除します。該当する箇所には、その代償を書いてあります。
Git29
git のエラーはほぼすべて「その状態でそれをやると何かが失われる」という拒否であり、fatal: は何も変えずに止まったという意味なので、一行目より下の hint: 行に本当の解決策が書かれていることが多いです。
npm20
npm では原因は最後の六行ではなく最初の code XXXX の一行に書かれており、失敗が自分のコードではなく依存関係の木やネイティブビルドから来ている場合は、node_modules を消して入れ直すだけで半分は解けます。
JavaScript15
ブラウザと node の誤りは、たいてい何が壊れたかだけを告げ、なぜその値がそうなったかは告げません — undefined を読んだ、関数ではなかった、JSON ではなかった。ですから直す場所は投げた行ではなくその値を作った上流であり、?. や既定値でその行だけ黙らせると、同じ問題がもっと遠くで、もっと分かりにくい形で戻ってきます。
Python18
Python のトレースバックは答えを二つに分けて置きます — 最後の一行が何が誤りかを、その上のフレームがどこで誤ったかを示すので、最後の行だけ読むと名前は分かって場所を落とします。とくに NoneType や KeyError のように値が無くて出る誤りは、落ちた場所より、その値を作った上のフレームに原因があります。
ビルドと型10
ビルドの誤りは実行前に道具が拒んだものなので、その場で何かを壊すわけではありません。代わりに二つを問います — 型や経路を実際の形に合わせて直すのか、それとも as any や抑制のコメント一つでその行だけ通すのか。そして大文字小文字や拡張子、環境変数のように自分の環境でだけ正しいものは、ここで初めて姿を見せます。
Docker12
docker の誤りは、まずどの層で起きたかを分けないと読めません — クライアントがデーモンに届かない、レジストリが拒む、ビルド中に RUN が失敗する、コンテナが起動した途端に死ぬ、はそれぞれ別の問題です。とくにビルドと実行の層では文言そのものが理由ではなく、中で動いていた命令が残した出力に理由があり、直す命令の代償も層ごとに違います。
エラーメッセージの読み方
- 一行目から読みます。下に行くほど道具の内部の話で、原因はたいてい一番上に書かれています。
- ファイル名と行番号があればそこが出発点です — スタックの最上段ではなく、自分が書いたファイルが出てくる一番上の行です。
- 文句はそのまま検索します。ただし自分のパスや変数名は消します — その部分が検索を邪魔します。
- 同じ事情が道具の版ごとに違う言い方で出ます。結果が合わないときは版番号も入れてみます。
- 直す命令を貼る前に、その命令が何を捨てるかを確かめます。取り消せないものが混ざっています。
よくある質問
Q. エラー文句を訳さないのはなぜですか。
検索するものだからです。道具は英語で出力し、訳した文句では何も見つかりません。言語に合わせるのは意味と対処だけです。
Q. 手元の画面と少し違います。
道具は版ごとに言い方を変えます。自分のパスや名前を消して残る骨格が同じなら同じエラーです。版が違うときは版番号も検索に入れます。
Q. 直す命令をそのまま実行してよいですか。
何を捨てるかを先に見ます。git reset --hard、強制プッシュ、docker system prune は戻せないものを消します — 該当する箇所には書いてあります。
Q. ここに無いエラーはどう探しますか。
文句から自分のパス・名前・数字を消し、残った部分だけを検索します。その残りが道具の作者が書いた文で、それで探すと結果が合います。