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在解释器的主循环中设置一个来捕获您的错误并继续处理您的输入来实现的。

rescue另一方面,没有块的脚本将允许异常一直传播,直到它到达顶层并杀死脚本。如果您希望脚本以某种方式继续运行,您将需要使用rescue. 最好在脚本中出现致命错误,因为它有助于调试(例如,PHP 风格的“不惜一切代价继续”往往会掩盖错误并使调试变得比需要的更困难。)

于 2013-03-09T08:11:59.987 回答
1

错误在您的程序中,它引发了 Ruby 可以理解的异常(ArgumentError 是 irb 知道如何处理的错误)。

如果每次有人编写蹩脚的代码时它都会死掉,那将是一个糟糕的 REPL :)

于 2013-03-09T08:13:04.680 回答