きしもとです

> |throwのかわりに、なにか別のメソッド(rewindという名前はどうでしょう?)を実行すると、catchのブロックが再実行される、というのはどうでしょうか?
> 
> 基本的なアイディアを否定するわけではありませんが、
> 
>  * catchブロックの再実行が必要なユースケースが示されていない
>  * rewindという名前はいろいろなところで使われているので望ま
>    しくない
> 
> ので、現時点では賛成しません。

ユースケースですが、The Art of Multiprocessor Programming の、
ロックフリースキップリストの find メソッド(Fig. 14.13)を Ruby で書いた
ものを示します。(begin と rescue と retry で同等のものを実装しています。
元の Java コードではラベル付きの continue でした)

    def find key, before_list, after_list
        retry_tag = Class.new Exception
        begin
            pp = nil
            p = @head
            @level_max.downto(0){|level|
                pp = p.links[level].get_link
                loop {
                    ppp, mark = pp.links[level].get
                    while mark do
                        snip = p.links[level].compare_and_set pp, ppp, false, false
                        unless snip then
                            raise retry_tag
                        end
                        pp = ppp
                        ppp, mark = pp.links[level].get
                    end
                    if pp.key.__send__(@cmp_op, key) == -1 then
                        p = pp
                        pp = ppp
                    else
                        break
                    end
                }
                before_list[level] = p
                after_list[level] = pp
            }
            if pp.key.__send__(@cmp_op, key) == 0 then
                pp
            else
                nil
            end
        rescue retry_tag
            retry
        end
    end
    private :find

また、しばらく考えてみたのですが、C言語で do { continue; } while (0); が
ループにならないことを考えると、デフォルトでは1回きりの実行が期待されている
catch との組み合わせはあまり良くないように思えてきました。

loop のブロックが引数を取るようにして、
loop {|tag|
 ...
 continue tag
 ...
}

というかたちではどうでしょうか?

あと、名前ですが、continue の他に loop と対になるので pool ...というのは
ダメですね多分。