Ruby | Manejo de excepciones en subprocesos | Serie 1

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *