マルチスレッドと例外2

るびきちさんに添削して頂いちゃいました。

あと、「strip!」すれば最後の改行は取れるのでchomp!は不要。

そうでした。最初に chomp! した後に「前後の空白無視したほうがいいじゃね?」と思いついて strip! を後付けしたのですが、確かに chomp! いりませんね。

Net::HTTPを使うときは自分でURIを解析するのではなくてURIクラスと併用すべき。

URI クラスは知りませんでした。もっともこのようなケースならば open-uri を使うのがスマートだったかもしれません。

Thread#joinしている場合はjoinを呼んでいるスレッド(この場合はメインスレッド)で例外が再発生する。

スレッド内部で rescue しなかった場合は、そのままスレッドが終了し、join された時点で例外が再発生する、という理解でいいのかな。例えばこんな感じにして例外を投げてみる。


while line = ARGF.gets
line.strip!
t = Thread.new(line) {|url|
get_http(url)
raise SocketError
}
threads.push(t)
end
確かに例外を投げているんだけれどもインタプリタが止まることはありませんね。標準入力から URI を入力しているので、Ctrl-D で入力を抜けた後に

thread.rb:18: SocketError (SocketError)

となります。そこで


threads.each {|t|
begin
t.join
rescue
print "#{$!}\n"
end
}
としてみると、なるほどここで例外が補足できました。
うーん、奥が深い。