In article <e0b1e5700910030430n41be3cc4n697f45b35e106b33 / mail.gmail.com>,
  Yusuke ENDOH <mame / tsg.ne.jp> writes:

>>>   A. StandardError を rescue してまとめて対処する
>>
>> 私がやっているものをみたら、これでした。
>
> 「open-uri を使うときは rescue StandardError でくるむ」という
> イディオムが推奨されるわけですかね。

別に推奨しているわけではありません。

> しかし open をブロック付きで使うことを考えると、それは少し不便です。

動機はわかります。

> そこで提案ですが、open-uri の内部で発生した例外は open-uri の中で
> すべて拾って、OpenURI::Error などと言った名前の例外にくるんで投げ
> なおすというのはどうでしょうか。
> ユーザは OpenURI::Error だけを拾えばいいということになって、気楽
> です。

この問題は open-uri 固有の問題には見えません。

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

open-uri としての解決法は、現時点では、ブロックをつけないで
使うのがいいのではないかと思います。

対象が大きくなければ、URI#read がお薦めです。
(samidare はそうしています)

あるいは、どうしてもブロックを使いたければ、試してませんがフ
ラグを使うのはどうでしょうか。

done = false
begin
  open(uri) {|f|
    done = true
    ...
  }
rescue StandardError
  raise if done
  ...
end
-- 
[田中 哲][たなか あきら][Tanaka Akira]