如何在线程中捕获异常
How to catch exceptions inside threads
为什么线程的行为与 ruby 中的其他一切不同?
我需要 运行 在不同的线程中编写一些代码,而不是让它们在每次意外发生时都消失得无影无踪。
Thread.new do
begin
raise "Exception"
rescue => exc
print exc
end
end
# Nothing happens
出于某种原因,这段代码什么都不做。在那之前我尝试使用 Thread::abort_on_exception = true
,没有任何改变。
那么,如何正确处理 ruby 线程内的异常?
您忘记了 join()
您的话题。此代码有效:
Thread.new do
begin
raise "Exception"
rescue => exc
print exc
end
end.join
正如 Ajedi32 所说,问题是程序在线程有时间写入之前就完成了 "Exception"。
这里有两点需要考虑:使用 Thread::abort_on_exception = true
使程序更容易调试,并避免出现令人讨厌的隐藏错误。第二个是我不应该在没有确保每个线程都正确结束的情况下退出程序。
代码应该改为:
Thread::abort_on_exception = true
my_thread = Thread.new do
begin
raise "Exception"
rescue => exc
print exc
end
end
#Do some parallel stuff
my_thread.join
为什么线程的行为与 ruby 中的其他一切不同? 我需要 运行 在不同的线程中编写一些代码,而不是让它们在每次意外发生时都消失得无影无踪。
Thread.new do
begin
raise "Exception"
rescue => exc
print exc
end
end
# Nothing happens
出于某种原因,这段代码什么都不做。在那之前我尝试使用 Thread::abort_on_exception = true
,没有任何改变。
那么,如何正确处理 ruby 线程内的异常?
您忘记了 join()
您的话题。此代码有效:
Thread.new do
begin
raise "Exception"
rescue => exc
print exc
end
end.join
正如 Ajedi32 所说,问题是程序在线程有时间写入之前就完成了 "Exception"。
这里有两点需要考虑:使用 Thread::abort_on_exception = true
使程序更容易调试,并避免出现令人讨厌的隐藏错误。第二个是我不应该在没有确保每个线程都正确结束的情况下退出程序。
代码应该改为:
Thread::abort_on_exception = true
my_thread = Thread.new do
begin
raise "Exception"
rescue => exc
print exc
end
end
#Do some parallel stuff
my_thread.join