0

「Sample.rb」という名前のファイル内にコードを書いたとします。

class Foo
def display()
p "hi"
end
end

Foo.new.display(1)

私のプログラムSample.rbは、そのメソッドにも配置されているポスト実行を実行せずに、処理しないと次のエラーが発生して、間違いなく終了します。

#ArgumentError: wrong number of arguments (1 for 0)
#        from (irb):2:in `display'
#        from (irb):6
#       from C:/Ruby193/bin/irb:12:in `<main>'

ここで別のポイントに来ます:

IRBそれ自体もプログラムです。以下のコードを受け入れ、次のように同じエラーを生成します。

>> class Foo
>> def display()
>> p "hi"
>> end
>> end
#=> nil
>> Foo.new.display 1
#ArgumentError: wrong number of arguments (1 for 0)
#        from (irb):2:in `display'
#        from (irb):6
#        from C:/Ruby193/bin/irb:12:in `<main>'
>>

なぜそのような場合、IRBそれ自体が突然終了せず、Fatal errorasNon- fatalおよび next>>プロンプトが私たちに与えるようなものを作っているのでしょうか?

4

2 に答える 2

2

何か間違ったことを入力した途端に対話型インタープリターが死んでしまうとしたら、最悪です。したがって、irb単にエラーをキャッチして出力し、終了するまで続行します。技術的には、これはrescueインタプリタのメイン ループに a を配置してエラーをキャッチし、入力の処理を続行することによって実現されます。

一方、ブロックのないスクリプトでrescueは、例外が最上位に達してスクリプトを強制終了するまで、例外が伝播されます。スクリプトをある程度処理し続けたい場合は、 を使用して例外をキャッチする必要がありますrescue。デバッグに役立つため、スクリプトに致命的なエラーがあることは望ましいことです (たとえば、「すべてのコストをかけて続行する」という PHP スタイルは、エラーを隠してデバッグを必要以上に困難にする傾向があります)。

于 2013-03-09T08:11:59.987 に答える
1

エラーはプログラム内にあり、Ruby が理解できる例外をスローします (ArgumentError は、irb が処理方法を知っているエラーです)。

誰かがくだらないコードを書くたびに死ぬとしたら、それは悪い REPL でしょう :)

于 2013-03-09T08:13:04.680 に答える