遠藤です。

2009年10月3日21:05 Tanaka Akira <akr / fsij.org>:
>> そこで提案ですが、open-uri の内部で発生した例外は open-uri の中で
>> すべて拾って、OpenURI::Error などと言った名前の例外にくるんで投げ
>> なおすというのはどうでしょうか。
>> ユーザは OpenURI::Error だけを拾えばいいということになって、気楽
>> です。
>
> この問題は open-uri 固有の問題には見えません。

その通りです。メールを送った直後に気がつきましたが、open-uri は
使用頻度のわりに例外が多種多様すぎたために最初に目に付いただけ
でした。


> つまりブロックつきメソッドの入れ子構造と例外捕捉のための入れ
> 子構造が異なるという問題なので、より一般的な解が望まれるよう
> に思います。

うーん。どんなのが考えられるでしょうね。


> open-uri としての解決法は、現時点では、ブロックをつけないで
> 使うのがいいのではないかと思います。
>
> 対象が大きくなければ、URI#read がお薦めです。
> (samidare はそうしています)

Kernel#open と同じように使えるという open-uri のありがたみが
ちょっと減った気がしましたが、Kernel#open にも似た問題はある
わけですね。とりあえず了解しました。


> あるいは、どうしてもブロックを使いたければ、試してませんがフ
> ラグを使うのはどうでしょうか。
>
> done = false
> begin
>  open(uri) {|f|
>    done = true
>    ...
>  }
> rescue StandardError
>  raise if done
>  ...
> end

うーん……。rescue にガードが書ければもう少し幸せそう。

-- 
Yusuke ENDOH <mame / tsg.ne.jp>