Los subprocesos también pueden contener excepciones. En los subprocesos de Ruby, la única excepción que surge en el subproceso principal se maneja, pero si surge una excepción en el subproceso (que no sea el subproceso principal), provoca la terminación del subproceso. El surgimiento de una excepción en un subproceso que no sea el subproceso principal depende del método abort_on_exception . El valor predeterminado de abort_on_exception es falso. Cuando el valor de abort_on_exception es falso, significa que la excepción no controlada aborta el subproceso actual y el resto de los subprocesos seguirán ejecutándose.
También puede cambiar la configuración de abort_on_exception usando bort_on_exception=true o $DEBUG a true . Los subprocesos de Ruby también proporcionaron un método para manejar las excepciones, es decir ::handle_interrupt. Este método manejará las excepciones de forma asincrónica.
Ejemplo:
# Ruby program to illustrate # the exception in thread #!/usr/bin/ruby threads = [] 4.times do |value| threads << Thread.new(value) do |a| # raising an error when a become 2 raise "oops error!" if a == 2 print "#{a}\n" end end threads.each {|b| b.join }
Producción:
0 3 1 main.rb:12:in `block (2 levels) in': oops error! (RuntimeError)
Nota: El método Thread.Join se usa para esperar a que finalice un hilo en particular. Porque cuando un programa de Ruby termina, todos los subprocesos se eliminan, independientemente de sus estados. También podemos guardar la excepción como se muestra en el siguiente ejemplo:
Ejemplo:
# Ruby program to illustrate hwo to # escape the exception #!/usr/bin/ruby threads = [] 5.times do |value| threads << Thread.new(value) do |a| raise "oops error!" if a == 3 print "#{a}\n" end end threads.each do |x| begin x.join # using rescue method rescue RuntimeError => y puts "Failed:: #{y.message}" end end
Producción:
0 1 4 2 Failed:: oops error!
Ahora establezca el valor de abort_on_exception= true , mata el hilo que contiene una excepción. Una vez que el hilo está muerto, no se producirá más salida.
Ejemplo:
# Ruby program to illustrate the killing # of thread in which exception raised #!/usr/bin/ruby # setting the value of abort_on_exception Thread.abort_on_exception = true threads = [] 5.times do |value| threads << Thread.new(value) do |a| raise "oops error!" if a == 3 print "#{a}\n" end end # using Thread.Join Method threads.each {|b| b.join }
Producción:
0 1 2 main.rb:13:in `block (2 levels) in': oops error! (RuntimeError)
La ejecución del hilo (que no sea el hilo principal) como se muestra a continuación:
Publicación traducida automáticamente
Artículo escrito por ankita_saini y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA