Tôi đang tìm một giải pháp về vấn đề xử lý ngoại lệ cổ điển. Xem xét đoạn mã sau đây:Xử lý các trường hợp ngoại lệ được nêu trong một chủ đề Ruby
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
Mã này bắt ngoại lệ sau 5 giây.
Nhưng nếu tôi thay đổi mảng thành [15, 5, 20, 3]
, thì mã trên sẽ bắt ngoại lệ sau 15 giây. Trong ngắn hạn, nó luôn luôn bắt ngoại lệ được nêu ra trong thread đầu tiên.
Bất kỳ ý tưởng nào, tại sao vậy. Tại sao nó không bắt ngoại lệ sau 3 giây mỗi lần? Làm thế nào để tôi nắm bắt được ngoại lệ đầu tiên được nâng lên bởi bất kỳ chủ đề nào?
nhờ cho câu trả lời của bạn. Tôi biết về cờ abort_on_exception. Nhưng yêu cầu của tôi là để biết đó là chủ đề đầu tiên để tăng ngoại lệ và sau đó thực hiện một số quyết định về nó. –
@AkashAgrawal, tôi không đưa bạn nhận xét cuối cùng. Bạn sẽ bắt được ngoại lệ đầu tiên (từ thread với sleep 3) trong mệnh đề 'rescue' và ở đây bạn có thể đưa ra quyết định của bạn về nó. Tất cả các chủ đề còn lại sẽ tiếp tục chạy nếu chủ đề chính của bạn sẽ không thoát sau khi ngoại lệ đầu tiên. –
Vì vậy, đây là một mã thử nghiệm. Câu hỏi của tôi là làm thế nào tôi sẽ bắt được ngoại lệ đầu tiên ném từ bất kỳ chủ đề. Bất kỳ chủ đề có thể ném ngoại lệ bất cứ lúc nào. –