【问题标题】:Combining `raise` and `throw`结合`raise`和`throw`
【发布时间】:2015-10-09 14:00:56
【问题描述】:

我有一个函数:

def g
  ''.each_line.next
end

由于each_line 在空字符串上返回一个行迭代器,next 引发异常StopIteration: iteration reached an end

除此之外,我还有另一个功能:

def f
  catch :aSymbol do
    loop do
      g
    end
  end
end

catch 将捕获符号 :aSymbol 如果它被抛出某个地方,但情况并非如此,所以这个函数应该引发相同的异常。但是,调用f 不会这样做;它的行为就像catch 也会默默地拯救异常。这是预期的行为吗?

【问题讨论】:

    标签: ruby exception


    【解决方案1】:

    这与 catch 无关 - 可以使用

    观察行为
    def f
      loop do # Loop will abort during first iteration
        g
      end
    end
    

    这是因为loop 拯救了StopIteration 并将其解释为您想要突破loop(参见loop 的定义)

    【讨论】:

    • 哈哈,我盯着指令序列足足看了 5 分钟 :)
    • 哇啊啊啊啊!这确实应该进入loop文档,因为这种行为根本不明显!
    • 我刚刚注意到它记录在StopIteration,但没有记录在loop...
    猜你喜欢
    • 1970-01-01
    • 2018-05-30
    • 2011-06-15
    • 1970-01-01
    • 2012-06-04
    • 2012-06-09
    • 2010-12-22
    • 2020-08-03
    • 2012-02-27
    相关资源
    最近更新 更多