📜  红宝石 |线程中的异常处理 |套装 – 1

📅  最后修改于: 2022-05-13 01:54:25.491000             🧑  作者: Mango

红宝石 |线程中的异常处理 |套装 – 1

线程也可以包含异常。在 Ruby 线程中,仅处理主线程中出现的异常,但如果线程中出现异常(主线程除外),则会导致线程终止。主线程以外的线程中异常的产生取决于abort_on_exception 方法abort_on_exception 的默认值为 false。当 abort_on_exception 的值为 false 时,意味着未处理的异常中止当前线程,其余线程将继续运行。
您还可以通过将bort_on_exception=true 或 $DEBUG 更改为 true来更改 abort_on_exception 的设置。 Ruby 线程还提供了一种处理异常的方法,即::handle_interrupt 。这将方法异步处理异常。

例子:

# 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 }

输出:

0
3
1
main.rb:12:in `block (2 levels) in ': oops error! (RuntimeError)

注意: Thread.Join方法用于等待特定线程的完成。因为当 Ruby 程序终止时,所有线程都会被杀死,而不管它们的状态如何。我们还可以保存异常,如下例所示:

例子:

# 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

输出:

0
1
4
2
Failed:: oops error!

现在设置 abort_on_exception= true 的值,它会杀死包含异常的线程。一旦线程死了,就不会再产生输出了。

例子:

# 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 }

输出:

0
1
2
main.rb:13:in `block (2 levels) in ': oops error! (RuntimeError)

线程(除了主线程)的执行如下图: