【エラーで困ったらコレ!】初心者向けプログラミングエラー対策ガイド

IT技術

プログラミングを始めたばかりの頃にぶち当たる最初の大きな壁、それが「エラーの解読」です。

コードを書くのは意外と早く慣れるんですが、エラーにどう対処すればいいのかって、なかなか具体的な指示がないんですよね…。

この記事では、プログラミング初心者のみなさんがエラーをどう読み解いて、どうやって解決していくべきかを徹底的に解説していきます!

Yang
Yang

エラーはともだち!これを読んで、エラーに立ち向かっていきましょう!

前提:エラーはともだち!ミスじゃない!

まず大事なのは、エラーって決してあなたのミスじゃないってことです。
プログラミングしていると、真っ赤なエラーメッセージが突然表示されて、まるでプログラムに怒られているような気分になることがあるかもしれません。でも、実はそうじゃないんです。

たとえば、Pythonでリストの要素にアクセスしようとして、インデックスが範囲外になっている場合、次のようなエラーメッセージが表示されます。

my_list = [1, 2, 3]
print(my_list[5])

これを実行すると、IndexError: list index out of rangeというエラーが出ます。最初はこのエラーメッセージがめちゃくちゃ怖く見えるかもしれませんが、実はプログラムが「このインデックスは範囲外だよ、大丈夫そ?」って優しく教えてくれてるんです。

エラーって、実はあなたが意図した通りにプログラムを動かすための「手ほどき」なんですよ。プログラムが正しく動くために必要な条件が満たされてないときに、エラーという形で「ここに問題があるよ」って教えてくれてるんです。言い換えると、エラーはプログラムが「これ、大丈夫?」って心配してくれてるメッセージなんです。

たとえば、SyntaxErrorもその一例です。次のようなコードを考えてみてください。

print("Hello, World!"

このコードを実行しようとすると、SyntaxError: unexpected EOF while parsingというエラーが出ます。これは、括弧が閉じられていないことをプログラムが検知して、「このコード、このままじゃ動かないよ」と教えてくれているんですね。

エラーメッセージが出たときは、そのメッセージが何を伝えようとしているのかを理解することがめちゃくちゃ重要です。

エラーはあなたを責めているわけじゃなくて、プログラムが正しく動くように手助けしてくれてるんです。

だからこそ、エラーを恐れずに「ありがとうエラー!」の気持ちで対策に取り組んでみてください!

Yang
Yang

ありがとうエラー!

エラーが出たら最初にやることは?

プログラムを実行してエラーが出たとき、まず何をすればいいのか迷うことがありますよね。
そんなとき、最初にやるべきことは、エラー文をじっくり読んで、何が問題なのかを理解することです。

エラー文に書かれていることをじっくり読む

エラーが発生したときに表示されるエラーメッセージは、あなたにとって超重要な情報源です。ほとんどのエラー文は、エラーが発生した行番号とその理由がセットで表示されるので、これを確認することで問題解決の手がかりを得ることができます。

たとえば、Pythonで次のようなコードを考えてみましょう。

x = 10
y = 0
result = x / y
print(result)

このコードを実行すると、次のようなエラーメッセージが表示されます。

ZeroDivisionError: division by zero

エラーメッセージには「ZeroDivisionError」というエラーの種類と、「division by zero(ゼロによる除算)」という理由が明確に示されています。また、エラーが発生した行も表示されます。この情報から、「yが0だから、この行でゼロで割り算しているからエラーが起きてるんだな」と理解できます。

次に、このエラーを修正するには、まずコードの該当箇所を確認して、0で割り算しないように修正すればOKです。たとえば、以下のように修正します。

x = 10
y = 1 # 0以外の値に変更
result = x / y
print(result)

このように、エラー文をじっくり読むことで、エラーの原因を特定して、それに応じた修正ができるんです。

さらに、以下のような例を考えてみましょう。

name = "John"
print("Hello, " + name)
print("Age: " + 25)

このコードを実行すると、次のエラーが発生します。

TypeError: can only concatenate str (not "int") to str

このエラーメッセージでは、「TypeError」というエラーの種類と、「str(文字列)にint(整数)を結合できない」という理由が示されています。行番号も表示されるので、エラーがどの行で発生しているのかも一目瞭然です。この場合、「Age: ” + 25」の部分が問題で、整数型の25を文字列に変換する必要があることが分かります。(整数型など型のお話が分からなければ、ぜひ検索してみてください。検索も立派なエラー対策!)

このエラーを修正するには、以下のようにコードを変更します。

name = "John"
print("Hello, " + name)
print("Age: " + str(25))

こうやって、エラー文をしっかり読むことで、エラーの原因と修正方法が見えてくるんです。

特に、エラーメッセージにはコードの問題点が具体的に書かれていることが多いので、まずはそのメッセージをじっくり読んで、何が問題なのかをしっかり把握することが大事です。コンマの不足や誤字、データ型のミスなど、基本的な問題であることが多いので、焦らずにエラー文を確認しましょう。

抽象的なエラーと定義ミスの対応

でも、すべてのエラーが直接的な理由で起こるわけじゃないんです。

特に厄介なのが、抽象的なエラーや、定義が別にある場合です。例えば、PythonやSQLでよく見かける「syntax error」は、その典型例ですね。

Pythonは巷では「初心者向け言語」と揶揄されていますが、エラーの不誠実さはピカイチです。何とも言えない気持ちだ…

「文法エラーって何?」と悩むことが多いですが、実際にはその行にコンマが足りないとか、誤字があるとか、基本的な書き方のミスで発生することがほとんどです。この場合、その行をじっくり確認することが重要です。

一方、関数を使っている部分でエラーが発生した場合、原因が別の箇所にあることもあります。

関数の処理を定義している部分が間違っていることが多いので、エラー文だけでなく、関連するコード全体を見直すことがポイントです!

ログと検索で原因を探る

エラーの原因がどうしても分からない場合、ログを確認するのが超有効な手段です。

ログには、エラーが発生する前後の処理や詳細な情報がしっかり記録されていて、問題解決のヒントが隠れてるんです。また、エラーメッセージをそのまま検索エンジンで調べるのも効果的です。同じ問題に直面した人たちの解決策が見つかるかもしれません。

ログを確認して原因を特定する(中級者向け)

Pythonの場合
Pythonでアプリケーションを開発していると、エラーが発生したときに詳細な情報をログファイルに出力するのが一般的です。特に、logging モジュールを使うと、簡単にログを管理できます。
例:ファイル読み込み時のエラー
以下のコードでは、存在しないファイルを読み込もうとしてエラーが発生します。

import logging

# ログの設定
logging.basicConfig(filename='app.log', level=logging.ERROR)

def read_file(file_path):
with open(file_path, 'r') as file:
return file.read()

try:
content = read_file('non_existent_file.txt')
except Exception as e:
logging.error("Error occurred while reading file", exc_info=True)

解説:

  • logging.basicConfig を使って、ログの出力先やレベルを設定しています。
  • 存在しないファイル 'non_existent_file.txt' を開こうとして FileNotFoundError が発生します。
  • except ブロックでエラーをキャッチして、logging.error を使ってエラーの詳細をログファイルに記録します。
  • exc_info=True を指定することで、スタックトレース(エラーが発生した箇所の詳細な情報)もログに含めることができます。

ログファイル app.log の内容:

ERROR:root:Error occurred while reading file
Traceback (most recent call last):
File "example.py", line 9, in
content = read_file('non_existent_file.txt')
File "example.py", line 6, in read_file
with open(file_path, 'r') as file:
FileNotFoundError: [Errno 2] No such file or directory: 'non_existent_file.txt'

ログの読み方:

  • エラーレベル: ERROR で、重大な問題が発生したことを示しています。
  • メッセージ: Error occurred while reading file は、どの操作中にエラーが起きたかを説明しています。
  • スタックトレース: エラーが発生した正確な場所と原因が詳細に示されています。この場合、read_file 関数内で FileNotFoundError が発生したことがわかります。

この情報からわかること:

  • 指定したファイルが存在しないためにエラーが発生している。
  • 解決策として、ファイルパスを正しく指定するか、ファイルが存在するかを事前にチェックする処理を追加することが必要です。

SQLの場合
データベース操作中にエラーが発生した場合、多くのデータベースシステムはエラーログを記録します。ここでは、MySQLを使っている場合のログ確認方法を紹介します。
例:テーブルへの挿入時のエラー

INSERT INTO users (id, name, email) VALUES (1, 'John Doe', 'john@example.com');

このクエリで発生する可能性のあるエラー:

  • テーブル users が存在しない。
  • id が主キーで、すでに値 1 が存在する。
  • email フィールドにユニーク制約があり、同じメールアドレスがすでに存在する。

ログの確認方法:
MySQLでは、エラーログは通常 mysql.err などのファイルに記録されます。ログには、エラーが発生した時間、クエリ、エラーメッセージなどが含まれます。
ログの一部:

[ERROR] [2023-09-01 12:00:00] Duplicate entry '1' for key 'PRIMARY'

ログの読み方:

  • エラーレベル: ERROR で、問題が発生したことを示しています。
  • タイムスタンプ: エラーが発生した日時を示しています。
  • メッセージ: Duplicate entry '1' for key 'PRIMARY' から、主キーの重複が原因でエラーが発生したことがわかります。

この情報からわかること:

  • id フィールドに値 1 が既に存在するため、重複エラーが発生している。
  • 解決策として、新しい一意のIDを割り当てるか、id フィールドを AUTO_INCREMENT に設定することが必要です。

ログを見る際のポイント:

  • 焦らずに読む: ログには大量の情報が含まれていて、最初は圧倒されるかもしれませんが、必要な部分だけを丁寧に読み解くことが大事です。
  • キーワードを探す: エラーメッセージや関連する関数名、変数名など、問題解決に直結するキーワードに注目すると理解しやすくなります。
  • 時間を追う: エラーが発生する直前の処理を追跡することで、原因を特定しやすくなります。

検索エンジンで情報を収集する

ログやエラーメッセージを読んでも解決策が見つからない場合は、検索エンジンでエラーメッセージをそのまま検索するのが超効果的です!

むしろ最初からこれをやれ!とも言われそうですが、ある程度エラーを読んで目星がついてからのほうが、検索が価値のあるものとなったりしま。。
検索の手順:

  1. エラーメッセージをコピー: 発生したエラーメッセージ全体、または重要な部分をコピーします。
  2. 検索エンジンに貼り付けて検索: Googleなどの検索エンジンにエラーメッセージを貼り付けて検索します。
  3. 結果を確認: 表示された検索結果から、信頼性の高いサイト(公式ドキュメント、Stack Overflow、Qiitaなど)をチェックします。
  4. 解決策を試す: 見つけた解決策を自分のコードに適用して、問題が解決するか確認します。

例:Pythonのエラーを検索

TypeError: unsupported operand type(s) for +: 'int' and 'str'

検索結果から得られる情報

  • 原因: 整数型と文字列型を直接足し算しようとしたために発生するエラー。
  • 解決策: 型を揃えるために、str() もしくは int() を使って明示的に型変換を行う。

きれいにまとめてはいますが、ここにたどり着くまでたくさんのサイトを閲覧しています。
これかな?というものがあったら、失敗を恐れず、上記のように「原因」「解決策」を書き出してみましょう!
修正前のコード:

age = 25
message = "Your age is: " + age
print(message)

修正後のコード:

age = 25
message = "Your age is: " + str(age)
print(message)

SQLのエラーを検索

ERROR: column "usernme" does not exist

検索結果から得られる情報:

  • 原因: クエリ内で列名を誤って入力している(タイポ)。
  • 解決策: 正しい列名に修正する。

修正前のクエリ:

SELECT usernme FROM users WHERE id = 1;

修正後のクエリ:

SELECT username FROM users WHERE id = 1;

検索を効果的に行うポイント:

  • エラーメッセージをそのまま検索: 具体的なエラーメッセージをそのまま入力することで、同じ問題に直面した人の解決策が見つかりやすくなります。コピペで全然OKです。
  • 英語で検索: 特に専門的な情報は英語の方が豊富な場合が多いので、可能であれば英語で検索するのをおすすめします。
  • 複数のソースを確認: 一つの解決策でうまくいかない場合もあるので、複数の情報源をチェックして最適な解決策を探しましょう。このポイントが一番の正念場です。あきらめずにガンガン探していってください。
  • 公式ドキュメントを参照: 信頼性の高い情報を得るために、可能な限り公式ドキュメントも確認しましょう。

例)Javaであれば以下が公式になっています。

補足:情報源は英語のサイトのほうが確実で詳細

プログラミングにおいて、問題解決のためにめちゃくちゃ重要なスキルの一つが「英語力」です。プログラミングに関する情報の多くは英語で書かれていて、特に日本語での情報が少ないマイナーなプログラミング言語については、英語のドキュメントやフォーラムが頼りになることが多いんです。英語が理解できると、これらのリソースを使って解決策を見つけることができるようになり、問題解決の幅が広がります。

たとえば、Rustという言語を例に考えてみましょう。

Rustは安全性とパフォーマンスを両立したシステムプログラミング言語として注目されていますが、まだ新しい言語なので、日本語の情報は少ないんです。Rustでプログラムをコンパイルした際に、次のようなエラーメッセージが表示されたとします。

error[E0382]: borrow of moved value: `x`

このエラーメッセージに対して、日本語での情報が少ないため、英語で「Rust error[E0382]: borrow of moved value」などと検索する必要があります。英語で検索することで、Rustの公式ドキュメントやStack Overflowなどのフォーラムにたどり着いて、エラーの詳細な説明や解決方法を見つけられるでしょう。

もう一つの例として、Kotlinを挙げてみます。

Kotlinは、Androidアプリ開発で広く使われている言語ですが、Javaに比べると情報量が少ないです。たとえば、次のようなエラーが表示された場合を考えてみましょう。

NullPointerException: Attempt to invoke virtual method on a null object reference

このエラーメッセージはJavaでもよく見られるものですが、Kotlinではもっと頻繁に遭遇することがあります。英語で「Kotlin NullPointerException null object reference」と検索すると、Kotlin特有の解決策や回避方法に関する情報が見つかります。特にKotlinの非公式ガイドやブログ、開発者コミュニティは多くが英語で書かれているので、英語が理解できることでアクセスできる情報が増えるんです。

このように、英語力を身につけることで、もっと多くの情報源にアクセスできるようになり、プログラミングの問題解決がスムーズになります。

特に、RustやKotlinのような新しい言語や、日本ではまだメジャーじゃない言語を使っている場合、英語のドキュメントやフォーラムが頼りになることが多いです。IT業界で必要な英語スキルを効率よく身につけるための勉強法を活用して、ぜひ英語力を高めてください。

それがあなたのプログラミングスキルを次のレベルに引き上げる大きな武器になるはずです。

IT業界における英語の勉強法・活用法については以下の記事に書いてます。ぜひご参考に。

おわりに

エラーが出たときの対策は、「エラーの発生行を確認する→エラー文を読む→エラーが行の内容を直接的に表現しているか確認する→調べる or 自力で修正する」という流れで進めるのが基本です。エラーを修正する数が増えると、だんだんと楽しくなってくるはずです。最初は苦しいかもしれませんが、慣れてくると本当に楽しくなるので、ぜひ頑張ってエラーを攻略していきましょう!