结合`raise`和`throw`

use*_*428 1 ruby exception

我有一个功能:

def g
  ''.each_line.next
end
Run Code Online (Sandbox Code Playgroud)

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

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

def f
  catch :aSymbol do
    loop do
      g
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

catch:aSymbol如果符号被抛出某个地方将会捕获该符号,但事实并非如此,因此该函数应该引发相同的异常.但是,打电话f不这样做; 它的行为,好像catch也会默默地拯救这个例外.这是预期的行为吗?

Fre*_*ung 5

这与catch无关 - 可以观察到行为

def f
  loop do # Loop will abort during first iteration
    g
  end
end
Run Code Online (Sandbox Code Playgroud)

这是因为loop救援StopIteration和解释意味着你想要突破loop(参见循环的定义)