如何使Ruby捕获线程中的语法错误

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捕获这样的错误?或者至少,在一个帖子中报告错误?

fal*_*tru 6

使用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)