xis*_*xis 5 ruby multithreading
我正在尝试使用ruby编写一个双线程客户端,一个线程从套接字读取数据并将其打印出来,另一个线程读取本地数据并将其发送到远程服务器.我发现的问题是看起来Ruby无法捕获线程中的错误,这是一个例子:
#! /usr/bin/ruby
Thread.new {
loop {
$stdout.puts "hi"
abc.puts ef
sleep 1
}
}
loop {
sleep 1
}
Run Code Online (Sandbox Code Playgroud)
显然,如果我键入abc.puts ef代码,那么在线程之外将永远不会运行,因为Ruby将报告"未定义变量abc".但是,如果它在一个线程内,则没有错误报告.我的问题是,如何让Ruby捕获这样的错误?或者至少,在一个帖子中报告错误?
使用Thread :: abort_on_exception =:
根据线程 - 异常处理:
任何线程都可以使用raise instance方法引发异常,该方法的操作类似于Kernel#raise.
但是,重要的是要注意除主线程之外的任何线程中发生的异常取决于abort_on_exception.默认情况下,此选项为false,这意味着任何未处理的异常都会导致线程在由join或value等待时以静默方式终止.您可以通过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
}
Run Code Online (Sandbox Code Playgroud)
=>
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>'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2083 次 |
| 最近记录: |