红宝石 |线程中的异常处理 |套装 – 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)
线程(除了主线程)的执行如下图: