使用catch / throw打破ruby内部块

时间:2012-08-21 03:32:36

标签: ruby exception

如果在内部红宝石块中抛出异常,我有兴趣打破外部和内部块。代码可能如下所示:

catch "ExitBlock" do
      foo.each_with_index do |el, idx|
        bar = ... // do more stuff, 
        bar.each_with_index do |el1, idx1|
          if some_bad_stuff
            throw "ExitBlock"
          end
        end
      end
    end

如果some_bad_stuff为true,它应该退出外部块和内部块,而不仅仅是内部块。上面的代码给了我一个ArgumentError但是:

ArgumentError: uncaught throw "ExitBlock"

我做错了什么?

2 个答案:

答案 0 :(得分:2)

它适用于符号:

catch :exit_block do
  foo.each_with_index do |el, idx|
    bar = ... // do more stuff, 
    bar.each_with_index do |el1, idx1|
      if some_bad_stuff
        throw :exit_block
      end
    end
  end
end

但是文档说 "[argument] can be an arbitrary object, not only Symbol"

我不知道发生了什么。

答案 1 :(得分:0)

只是打破循环而不是将异常带入混合中会更加清晰:

foo.each_with_index do |el, idx|
    bar = ... // do more stuff, 
    break_outer = false
    bar.each_with_index do |el1, idx1|
        if some_bad_stuff
            break_outer = true
            break
        end
    end
    if break_outer
        break
    end
end