2013-08-17 18 views
5

我想使用ruby編寫雙線程客戶端,一個線程從套接字讀取數據並將其打印出來,另一個線程讀取本地數據並將其發送到遠程服務器。我發現的問題是,它看起來像紅寶石不能在一個線程中捕獲的錯誤,這裏有一個例子:如何讓Ruby捕獲線程中的語法錯誤

#! /usr/bin/ruby 

Thread.new { 
    loop { 
    $stdout.puts "hi" 
    abc.puts ef 
    sleep 1 
    } 
} 


loop { 
    sleep 1 
} 

顯然,線程之外,如果我輸入abc.puts ef的代碼,因爲紅寶石將永遠不會運行會報告「未定義的變量ABC」。但是,如果它在一個線程內,則沒有錯誤報告。我的問題是,如何讓Ruby捕獲像這樣的錯誤?或者至少,在一個線程內報告一些錯誤?

+0

'SyntaxError'不會引發,而是'NameError'。 – falsetru

回答

6

使用Thread::abort_on_exception=

根據Thread - Exception Handling

任何線程都可以引發異常使用提升實例方法 ,其操作類似於Ke rnel#加薪。

但是,需要注意的是,除主線程之外的任何 線程中發生的異常取決於abort_on_exception。此 選項默認爲false,這意味着任何未處理的異常將 都會導致線程在等待 或值等待時自動終止。您可以通過abort_on_exception = true或將$ DEBUG設置爲true來更改此默認值。

...

Thread::abort_on_exception = true 
Thread.new { 
    loop { 
    $stdout.puts "hi" 
    abc.puts ef 
    sleep 1 
    } 
} 


loop { 
    sleep 1 
} 

=>

hi 
t.rb:5:in `block (2 levels) in <main>': undefined local variable or method `abc' for main:Object (NameError) 
     from t.rb:3:in `loop' 
     from t.rb:3:in `block in <main>' 
0

好,一個可能的解決方案是圍繞線程拉姆達與beginrescueend塊:

Thread.new { 
begin 
    abc.puts ef 
rescue 
    puts error 
end 
}