I had an issue at work where some database writes were throwing errors within a thread, and the error was being silently eaten when the thread died.
The solution is to use a queue for inter-thread communication, like this:
q = Queue.new
Thread.new do
i = 1
loop do
begin
sleep i
i += 1
raise 'whatever'
rescue StandardError => e
q << e
end
end
end
loop do
puts q.size
end