class Ractor::ClosedError

Raised when an attempt is made to send a message to a closed port, or to retrieve a message from a closed and empty port. Ports may be closed explicitly with Ractor#close_outgoing/close_incoming and are closed implicitly when a Ractor terminates.

r = { sleep(500) }
r.take # Ractor::ClosedError

ClosedError is a descendant of StopIteration, so the closing of the ractor will break the loops without propagating the error:

r = do
  loop do
    msg = receive # raises ClosedError and loop traps it
    puts "Received: #{msg}"
  puts "loop exited"

3.times{|i| r << i}
puts "Continue successfully"

This will print:

Received: 0
Received: 1
Received: 2
loop exited
Continue successfully