2013-08-17 6 views
5

Ich versuche, eine Zwei-Thread-Client mit Ruby, ein Thread liest die Daten aus einem Socket und drucken Sie es aus, der andere Thread liest lokale Daten und senden Sie es an entfernter Server. Das Problem, das ich gefunden ist, dass es aussieht wie Ruby Fehler nicht innerhalb eines Threads erfassen kann, hier ein Beispiel:Wie mache ich Ruby erfassen den Syntaxfehler in Threads

#! /usr/bin/ruby 

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


loop { 
    sleep 1 
} 

Offensichtlich außerhalb des Threads, wenn ich abc.puts ef der Code eingeben werden nie da Ruby-laufen „undefinierte Variable melden ABC". Wenn es jedoch innerhalb eines Threads ist, gibt es keinen Fehlerbericht. Meine Frage ist, wie kann man Ruby solche Fehler erfassen lassen? Oder zumindest, melden Sie etwas in einem Thread falsch?

+0

'SyntaxError' wird nicht ausgelöst, aber' NameError'. – falsetru

Antwort

6

Verwendung Thread::abort_on_exception=:

Nach Thread - Exception Handling:

Jeder Thread eine Ausnahme auslösen können Verwenden der Raise-Instanz-Methode , die ähnlich wie Ke funktioniert rnel # erhöhen.

Es ist jedoch wichtig zu beachten, dass eine Ausnahme, die in einem Thread außer dem Hauptthread auftritt, von abort_on_exception abhängt. Diese Option ist standardmäßig falsch, was bedeutet, dass jede nicht behandelte Ausnahme verursacht, den Thread zu beenden, stillschweigend, wenn auf beide Joins oder gewartet wird. Sie können diesen Standardwert ändern, indem Sie entweder abort_on_exception = true oder $ DEBUG auf true setzen.

...

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

Ok, ist eine mögliche Lösung, um die Gewinde Lambda mit beginrescueend Block umgeben:

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