结合`raise`和`throw`

时间:2015-10-09 14:00:56

标签: ruby exception

我有一个功能:

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也会默默地拯救这个例外。这是预期的行为吗?

1 个答案:

答案 0 :(得分:5)

这与catch无关 - 可以使用

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

这是因为loop救出了StopIteration,并将其解释为意味着您要突破loop(请参阅loop的定义)