プログラミング独学時のエラーをどう解決していけばいいのか考えていきたい

日々コードを書いていればエラーに当たるなんてもはや日常ですよね。むしろエラーが起きずに何かできるっていうことの方が少ない。エラーが起きたらそのエラーを解決して、またエラーを見つけては解決しての繰り返し。そうして一歩ずつ進んだ先にやっと目的のものが作れたりするんだ。

ただ最初のうちはプログラムを書くのにもエラーにも慣れていないし、そのエラーを解決するためにどうすればいいのか頭を悩ませてしまう。ストレスで禿げそうになることもあるだろう。だからこの記事ではそんなエラーをどのように解消していくかっていうことを書いていきたい。

エラーはエラー内容を表示してくれる

そもそもだけどエラーはエラー内容を表示してくれますよね。フロントで画面政策なんかしているとなんかうまくいかないけど、エラー出ない・・みたいなことはあるかもしれないけど、頭を悩まさせるエラーの大半はエラーメッセージが出るはず。

そう例えばこんな風に。

これはrubyのファイルを実行しようとしているけど、以下のようなエラーが出ている。

sample.rb:4: syntax error, unexpected end-of-input, expecting end

これはsample.rbの4行目でsyntax error(構文のエラー)が起きているって言っているね。unexpected end-of-input, expecting endと書かれている。最後の方にはendが必要なんじゃない?みたいなことを言われている。そうこれはメソッドにendがないだけだ。endをつけるとちゃんと動いてくれる。

他にも例えばこんなエラー。

sample.rb:2:in `say': undefined method `echo' for main:Object (NoMethodError)

main:Objectにechoなんてメソッドは定義されていないよ!と出ています。NoMethodErrorと書かれているから分かりやすいですね。

こんな風にプログラムはエラーを起こすとそのエラー内容を表示してくれる。

エラー出た、わかんねえ謎だわ・・・!

ってなる気持ちもあるけど、何も焦ることはない大体そこに何がエラーになっているのかを示してくれている。だからまずはこのメッセージを頼りに解決していけばいいのだ。英語で難解感を醸し出しているけど惑わさせる必要はない。意味わからん英語出てきたら翻訳っていう手段もある。

エラーが起きた際の解決手順

エラーが起きた際にはそのエラーメッセージを見て取り組めば解決に至ることが多い。イメージとしてはこんな感じだろうか。

  1. エラーが出る(エラーメッセージが出る)
  2. エラーメッセージを読む(理解する)
  3. 理解できない場合翻訳などあらゆる手段を使い理解する
  4. わからなければ調べる
  5. エラーの原因を排除する

エラーが出たら絶望的な気持ちにならずに一旦落ち着いて、このエラーは果たして何を言っているのか?っていうのを理解しよう。理解できなかったら翻訳したり検索してみる。そうするとそこまで難解じゃないものは大体どこを直せばいいか分かるんじゃないだろうか。

エラーが出る

例えば開発中にこんなエラーが出たとしよう。Internal server error、よくみるやつですね。

画面を見てなんだよ全くわからん・・・ってなるエラーだけで一応開発者ツールでコンソールも見ておこう。

同じようなエラーですね。これだけではどうしようもないので、ターミナルを見ます。そうすると何やら色々出ていますね。

ERROR[ExceptionsHandler] SQLITE_ERROR: no such table: item

エラーメッセージを読むSQLiteののエラーでitemっていうテーブルがないよって言われていますね。となればテーブルの確認です、データベースにitemっていうテーブルがないのが原因でエラーが起きているようなので、テーブルがあるかを確認しましょう。やるべきことは以下。

  • SQLiteの中に入る(⇨は入り方がわからなければ調べる)
  • itemというテーブルがないかの確認(テーブルの確認方法がわからなければ調べる
  • コードが合っていて、テーブルがなければmigrationのし忘れの恐れ(migration方法がわからなければ調べる

itemテーブルがないのを確認後、テーブルのmigrationファイルがあるのも確認。それを実行してテーブルを作った(エラーの原因を排除)後に確認すると期待通りに動くようになりました。

思考の動き的にはこんな感じだろうか。

  • itemテーブルが存在しないというエラー→テーブルが存在していれば動きそう→テーブルがなければmigrationのし忘れ?→migration確認してみよう

ただ最初のうちはそもそもテーブルってなんだよ?migrationってなんだよ?それらの扱うコマンドってなんだよ?っていう何が何だかわからない状況に陥る可能性がある。これらはプログラムがどう言った流れで動くのかを知っていないといけないからぶっちゃけ勉強しようとしか言えない・・・

それらをある程度把握しているなら、解決の糸口をエラーメッセージから見つけることができるんではないだろうか。ただ当たりが外れることなんて普通にあるからエラーを潰せるまで仮説と検証を繰り返そう。

デバッグしよう

プログラムを多く書いていると表示されたエラーがどこで起きたのかを判断しにくい。その際にはデバッグをしてどの部分でエラーが起きているのかを見つけよう。ここまではOKだけど、ここからは何故か値がなくてエラーが起きてそう・・・みたいな切り分けだ。

値を出力する

どこかで何かが起きてしまっている場合には、そこの部分を特定するために実行中の値を出力してみるといいです。変数に何が入っているかや受け取った値が何であるかを見ていこう。

JavaScriptのconsole.log()やRubyのputs()、PHPのvar_dump()などで出力したい値を指定すれば、それがなんであるかをみることができる。

コード量が多くなってきてどこで値が狂ってしまっているのかわからなくなったら、出力してみるといいです。

処理を使って処理を止めてみる(各言語やフレームワークの機能で処理は大体止めて確認できるはず

ぶっちゃけprintしてデバッグなんて面倒ですよね、フレームワークなんかには処理を止めてその時点での変数の中身を確認することができたりするので、それらを使いましょう。Railsのbinding.pryやLaravelのeval(\Psy\sh());なんかを使うと、その時点で処理を止めて変数の中身を確認できたりする。JavaScriptならdebuggerが便利ですね。

「言語やフレームワーク ブレークポイント」なんかで検索してみるといいかもしれません。

エラー内容をインターネットで検索する

エラーメッセージを見て何をすればいいのか分からなかったら、そのエラーをネットで検索してみよう。他の人が同じエラーを解決しているかもしれない。

ファイル名やユーザー名は入れて検索しない

エラーの内容が何言ってるか分からない時には、そのエラー分を丸々検索欄にコピーして貼り付けるっていうことをしてしまいがちだけど、油断するとファイル名やユーザー名など関係ないものまで貼り付けてしまう。ただそういったものを入れるのはやめよう。

例えばこんなエラーが出てきたらsample.rb:2っていうのはいらないでしょう。

sample.rb:2:in `say': undefined method `echo' for main:Object (NoMethodError)

sample.rbっていうのは自分でつけたファイルの名前ですから。それとechoっていうのも別に他のものでもいいはずだから外してもいいかもしれない。

英語でも読む

エラーを検索すると日本語より英語の情報が出てくることが多いと思います。日本語に堪能な我らにとっては苦しいことだろうけど、英語で回答されていたりするのでなんとかして読んでやりましょう。

Stackoverflow

stackoverflowの回答なんて結構見たことある人いるんじゃないでしょうか、こういうの見ていると英語できたらなあ・・・って思いますよね。翻訳を経由して読んで理解するのってちょっとしんどいけど、読んでいこう。

最終手段は新しくやり直す

このエラー全くわからねえ・・・別にどうでもいいアプリだしもうやり直して最初からやり直したい・・・っていう場合もあるでしょう。

エラーが出てきて直そうとして色々いじった結果、もう元には戻れないそんな状況も勉強していればきっとある。エラーを解決できるのが一番だけど、詰まりすぎて絶望感に陥ることもそりゃあやっていればありますよ。

そんな時にはもう今作っているものは削除して新しく作り直すっていうのも手段の1つではあると思います。特に作り始めのうちは。

そういう時にもDockerはいいと思います。

コンテナ削除して作り直すだけで新しいものを作ることができるので。パソコンに直インストールしたフレームワークやデータベースを使うと元のアプリケーションのものが残っちゃったり面倒ですからね。Docker使ったことない人は最初わけわかんないと思うけど、手を出してみることをお勧めします。

サイトで質問する

もう自分の力では解決に及ばない・・・となったら質問をサイトに投げかけてみるのもありでしょう。他の人の力を借りたい時もある。

stackoverflow

StackOverflowに質問を投げかけるのもいいでしょう、英語ができるのであれば英語で質問をすると世界中の優しいエンジニアが英語で回答をくれるかもしれない。一応日本語対応のStackOverflowもあるから日本語で質問したい人は見てみるといいですよ。

teratail

teratail

teratailはLeveragesっていうところがやっているQ&Aサイトでレバテックを運営している会社ですね。英語じゃなくて日本語なので英語全く分からん・・・っていう場合でも大丈夫。

検索すれば自分が知りたい質問回答があるかもしれないから検索してみるといいですよ。

まとめ

今回はプログラミングのエラーを解消するためにどういったことをすればいいか?っていうことを少し書いたけど、エラーって日々ぶち当たりますよね。プログラム書いていてエラーでない日なんてないぐらいだと思うし、中にはどう足掻いてもうまくいかん!っていう時もあると思う。

そうなったらしょうがないけど、できる限りの力でエラー潰してやりましょう。この記事で書いたことがちょっとだけでも役に立つかもしれない。