Busco a una solución del problema clásico de manejo de excepciones. Considere la siguiente pieza del código:Manejo de excepciones planteadas en un hilo Rubí
def foo(n)
puts " for #{n}"
sleep n
raise "after #{n}"
end
begin
threads = []
[5, 15, 20, 3].each do |i|
threads << Thread.new do
foo(i)
end
end
threads.each(&:join)
rescue Exception => e
puts "EXCEPTION: #{e.inspect}"
puts "MESSAGE: #{e.message}"
end
Este código captura la excepción después de 5 segundos.
Pero si cambio de la matriz como [15, 5, 20, 3]
, por encima de captura código de excepción después de 15 segundos. En resumen, siempre capta la excepción planteada en el primer hilo.
Cualquier idea, ¿por qué hacerlo. ¿Por qué no detecta la excepción después de 3 segundos cada vez? ¿Cómo atrapo la primera excepción planteada por cualquier hilo?
gracias por su respuesta. Conocí el flag abort_on_exception. Pero mi requisito es saber cuál es el primer hilo para hacer una excepción y luego tomar algunas decisiones al respecto. –
@AkashAgrawal, no obtengo tu último comentario. Capturará la primera excepción (de thread con sleep 3) en la cláusula 'rescue' y aquí puede tomar una decisión al respecto. Todos los subprocesos continuarán ejecutándose si su subproceso principal no saldrá después de la primera excepción. –
Así que este era un código de prueba. Mi pregunta fue cómo voy a ver la primera excepción lanzada desde cualquier hilo. Cualquier hilo puede lanzar una excepción en cualquier momento. –