コンピュータリテラシー演習のページへ
Rubyによるはじめてのプログラミング

エラーとその対処

プログラムを作る時、自分の思った通りに動かないことが多々あります。 その多くは、プログラムに何らかの欠陥があるのが原因です。 この欠陥のことを「バグ」(bug)と言います。

バグとは本来、小さな虫のことですが、 それが転じて機械やプログラムの何かおかしなところ、 つまり悪いところを意味するようになりました。 ちょうどプログラムの中に小さな虫が潜んでいて、たまに悪さをしている、 といったイメージです。

プログラムを作る作業の中の多くは、 このバグを潰して、正しく動くプログラムにする仕事になります。 このバグを潰す作業をデバッグ(debug)といいます。

バグがあるかどうかを知る最大のきっかけは、エラーの発生です。 エラーとは、プログラムを動作させた時に異常な状態になることです。 例えば、動いていたプログラムが突然反応しなくなった、動作不能な 状態になって異常終了した、止まるはずのプログラムがいつになっても 終了しない、といったことです。

簡単なデバッグ

ここでは実際のデバッグの手順を簡単なプログラムを例にして説明します。

例えば、以下のようなプログラムを書いたとします。 このプログラムは何ヶ所か間違っています。つまりバグがあります。

print "Welcome to Ruby\n
a = 100
r = a/0
print r, "\n"

このプログラムを実行してみましょう。ファイル名はbug.rbとします。

% ruby bug.rb
bug.rb:4: parse error
print r, "\n"

すると、print文の表示がされずにエラーが発生し、プログラムが途中で終ってしまいました。 画面には英語でエラーメッセージが出ています。 先頭の bug.rb:4: は bug.rbというファイルの4行目にエラーがあることを示しています。 つまりこれは、bug.rbファイルの4行目で 「プログラムを解釈したらエラーになった」というエラーメッセージです。 これは、どういうことでしょうか?とにかくエラーとなった4行目を見てみます。

4行目は何もおかしくありません。その上の行を順に見てください。 1行目の最後に " が抜けていることが分かると思います。 通常、文字列は、" で始まり " で終わらせないといけません。 このように、Rubyにエラーと言われた行と違う行にバグがあることがあります。

テキストエディタを開き、1行目の終りに " をつけて、再度 Ruby を実行します。

% ruby bug.rb
bug.rb:3:in `/': divided by 0 (ZeroDivisionError)
        from bug.rb:3
10

今度はうまくいきました。

[補足] bug.rb:3:in '/': divided by 0 (ZeroDivisionError) というエラーは3行目なのに、1行目で実行されるはずの Welcome to Rubyよりも先に表示されてしまいます(状況によっては、正しい順番の時もあります)。 実際には、1行目が先に実行されてから3行目でエラーが発生しているのですが、 このように表示の順番が食い違うことがあります。

これは、print文などによる表示は標準出力に、エラーメッセージは標準エラー出力に出されているためです。 詳細は、UNIXの標準入出力とリダイレクションを見てください。 標準エラー出力は出力依頼があると、即座に出力されますが、標準出力は出力依頼がある程度たまってからまとめて出力します(バッファリングといいます)。 このため、順番がかわってしまうのです。

以上のように、Rubyを実行する時に、明確にエラーメッセージが出たら、 エラーが出た行に間違いがないか確認してください。 しかし、明確にエラーメッセージが出る場合は、どちらかというと運が良いほうで、どこにバグがあるか見つけやすいものです。

むしろ問題は、エラーは出ないが何か動作がおかしいという場合で、 プログラムをじっくりと眺めてバグを探さなければなりません。 ここでは、細かなデバッグの方法はあえて説明しません。 動作がおかしな場合は、プログラムをじっくりと読み間違いを発見するように務めてください。 最初のうちは、それが一番勉強になると思います。

また、バグのせいでプログラムが止まらなくなることがあります。 そのような場合、Control-Cを押すとたいていの場合は止まります。 それでも止まらない場合は、(UNIXの場合は)killコマンドで強制的にプロセスを終了してください。


東京情報大学情報システム学科
大見 嘉弘(Yoshihiro OHMI)
<ohmi@rsch.tuis.ac.jp>