2013-03-09 52 views
0

假設我寫了一個名爲「Sample.rb」文件中的代碼:爲什麼`IRB`在它發現任何致命錯誤時不會退出?

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 errorNon- fatal和未來>>提示 給我們?

回答

2

只要您輸入錯誤的內容,即使交互式解釋程序死亡,您也會感到厭倦。因此,irb只是捕獲你的錯誤,打印出來,並繼續前進,直到你退出。從技術上講,這是通過在解釋器的主循環中有一個rescue來捕獲錯誤並繼續處理輸入來實現的。

另一方面,沒有rescue塊的腳本將允許異常一直向上傳播,直到達到頂級並殺死腳本。如果您希望腳本以某種身份保持暢通,則需要使用rescue來捕捉您的例外情況。這是需要有腳本致命的錯誤,因爲它與調試幫助(例如PHP風格「繼續不惜一切代價」往往掩蓋錯誤,並進行調試比它需要更加困難。)

1

的錯誤是在你的程序中,它引發了Ruby可以理解的異常(ArgumentError是irb知道如何處理的錯誤)。

這將是一個糟糕的REPL如果死了,每次有人寫蹩腳的代碼:)

+0

赫姆..我知道。我不是在指責IRB爲什麼這樣做?相反,我試圖瞭解它是如何處理的? :) – 2013-03-09 08:14:58

+0

我不怪IRB - 冒泡的例外是偉大的,但IRB應該從隔離 - 因爲我使用它作爲一個互動的工具更所以比一個調用應用。例如,Python默認情況下不會採用這種方式。 – cgseller 2016-01-12 20:39:33

相關問題