福嶋です。

以下のスクリプトを実行させるとIOErrorが発生しますが、その例外を捕
捉できません。

###################################
Thread.abort_on_exception = false
io = IO.popen('cat', 'r')

Thread.start {
  begin
    io.gets
  rescue IOError
    p 'thread rescue'
    p $!
  ensure
    p 'thread ensure'
  end
}
begin
  sleep 1
  io.close
rescue IOError
  p 'main rescue'
  p $!
ensure
  p 'main ensure'
end
###################################

このスクリプトを実行すると

foo.rb:16: stream closed (IOError)

と表示されるだけで、rescueやensureの中身が実行されません。
そもそも、どちらのスレッドで例外が発生しているのでしょう?

---
福嶋正機