1.はじめに
プログラミング初学者はエラーメッセージの読み解きにどうしても時間がかかってしまいます。とりあえず一番手っ取り早いエラーメッセージを全文コピーしてググる、というやり方をしがちです。しかし、ググればそれらしい情報にがいくつか引っかかりますが、絶対にそれが正しい情報だとは言い切れません。「プロを目指す人のためのRuby入門」で指摘されていますが、ググった結果を実行して、一見うまく解決できたように見えるものでも、実はセキュリティ的に重大な欠陥を生み出していたなんてことがあるそうです。なのでまずはエラーメッセージを読めるようになり、自身で問題点を抽出できるようになることが必要だと考えます。そうすればある程度すばやくバグやエラーを取り除ける上に、Rubyの構造を理解できるようになると考え、この記事を作成しました。
参考にしました→ プロを目指す人のためのRuby入門
2.バックトレースの読み方
プログラム実行中にエラーが発生すると、メソッドの呼び出し状況を表したデータを出力します。これをバックトレースと呼びます。ここではあえて間違った構文を入力しバックトレースを呼び出します。
irb(main):001:0> puts hoge
Traceback (most recent call last):
5: from /(Rubyがインストールされているパス)/irb:23:in `<main>'
4: from /(Rubyがインストールされているパス)/irb:23:in `load'
3: from /(Rubyがインストールされているパス)/irb:11:in `<top (required)>'
2: from (irb):1
1: from (irb):2:in `rescue in irb_binding'
NameError (undefined local variable or method `hoge' for main:Object)
上記はirb(ターミナル上で実行できるRuby)でputs hoge
という間違った構文を入力したために出力されたバックトレースです。hoge
をシングルクォート(')やダブルクォート(")で囲む等で文字列として認識できなかった為に出た至極単純なエラーです。一つ一つ丁寧に見ていきます。
まず
Traceback (most recent call last):
ですが、これはエラーメッセージではなく、訳するとトレースバック(最後の最新の呼び出し)、つまりRubyを実行してエラーまでの最新の実行過程を次に表示するよー、という文章です。そして次に
5: from /(Rubyがインストールされているパス)/irb:23:in `<main>'
4: from /(Rubyがインストールされているパス)/irb:23:in `load'
3: from /(Rubyがインストールされているパス)/irb:11:in `<top (required)>'
2: from (irb):1
1: from (irb):2:in `rescue in irb_binding'
ですが、エラーまでの実行過程を5:〜1:の流れで表示しています。下に行くほどエラーに近くなっています(言い換えると最新に近くなる)。ここで5:〜3:までは、「irbのプログラムの実行過程」、つづく2:では「irbの1行目を実行」という意味になります。1:は調べましたがrescue in irb_binding
の意味がわかりませんでした。「irbの2行目で補足がされているか」ということですかね?
つづいて、
NameError (undefined local variable or method `hoge' for main:Object)
こちらがエラーメッセージになります。まずNameError
ですが、エラーメッセージの種類です。エラーメッセージの種類については後ほど説明します。続くundefined local variable or method `hoge' for main:Object
ですが、hoge
を文字列と認識できていないため、ローカル変数か定数から探しており、それが定義されていないという意味になります。
今回は単純なミスによるバックトレースなので5行ですんでいますが、複雑なものになると何十行もの実行課程を表示されることがあります。そういった場合でも、冷静に内容をよく読むことが必要です。
3.主なエラーメッセージの種類
エラー名 | 概要 |
---|---|
NameError | 未定義のローカル変数や定数を使用したときに発生する |
NoMethodError | 存在しないメソッドを呼び出そうとしたときに発生する |
SyntaxError | ソースコードに文法エラーがあったときに発生する |
TypeError | メソッドの引数に期待される型ではないオブジェクトや、期待される振る舞いを持たないオブジェクトが渡された時に発生する |
SystemStackError | システムスタックがあふれたときに発生します。典型的には、メソッド呼び出しを無限再帰させてしまった場合に発生する |
LoadError | require や load が失敗したときに発生する |
その他のエラーについては、公式リファレンス参照します。
4.エラーメッセージで出会ったときの対処方法
(1)行った手順を確認し、バックトレースを読み込む。
(2)デバッガを使用する。
(3)irbで簡単なコードを動かしてみる。
(4)ログを調べる。
(5)公式ドキュメントを読む。
(6)issueを検索する。
(7)外部ライブラリのコードを読む。
(8)誰かに聞く。
5.まとめ
初学者の私は大量のエラーメッセージを目にするとかなりやる気が削がれてしまいます。エラーメッセージに対しては冷静かつ堅実な対応が必要ですね。エラーに遭遇したときのために、事前に対処法は考えといたほうが良いかもしれないです。