マルチスレッドと例外2
るびきちさんに添削して頂いちゃいました。
あと、「strip!」すれば最後の改行は取れるのでchomp!は不要。
そうでした。最初に chomp! した後に「前後の空白無視したほうがいいじゃね?」と思いついて strip! を後付けしたのですが、確かに chomp! いりませんね。
URI クラスは知りませんでした。もっともこのようなケースならば open-uri を使うのがスマートだったかもしれません。
Thread#joinしている場合はjoinを呼んでいるスレッド(この場合はメインスレッド)で例外が再発生する。
スレッド内部で rescue しなかった場合は、そのままスレッドが終了し、join された時点で例外が再発生する、という理解でいいのかな。例えばこんな感じにして例外を投げてみる。
確かに例外を投げているんだけれどもインタプリタが止まることはありませんね。標準入力から URI を入力しているので、Ctrl-D で入力を抜けた後に
while line = ARGF.gets
line.strip!
t = Thread.new(line) {|url|
get_http(url)
raise SocketError
}
threads.push(t)
end
thread.rb:18: SocketError (SocketError)
となります。そこで
としてみると、なるほどここで例外が補足できました。
threads.each {|t|
begin
t.join
rescue
print "#{$!}\n"
end
}
うーん、奥が深い。