同时拯救和捕捉

时间:2016-01-17 09:55:57

标签: ruby error-handling try-catch throw

如果我想同时挽救潜在的错误并抓住潜在的投掷,我该如何筑巢?这两个是否相同,这只是一个偏好的问题?

begin
  catch(:some_throw) do
    ...
  end
rescue SomeError
  ...
end


catch(:some_throw) do
  begin
    ...
  rescue SomeError
    ...
  end
end

2 个答案:

答案 0 :(得分:1)

这是一个基于意见的问题,人们可以争论。所以,在我看来......

如果您打算通过throw返回值,那么第二个选项似乎很有用,因为它会让您rescue出错并throw某种默认值。

即使您使用throwcatch来管理循环迭代并在某些条件下突破它,第二个选项似乎仍然更具可读性并封装了{{1}内的所有逻辑阻止。

答案 1 :(得分:1)

它们并不完全等同。使用第一个备选方案时,catch只会拦截begin子句中抛出的值,而第二个包含来自rescue的值。

话虽如此,如果您遇到这种情况,当两者相同时(也就是说您不在:some_throw子句中抛出rescue):

  • 第一种选择的论点是我们倾向于认为begin - rescue块包含“常规”语句。 throw - catch很少使用并且具有非错误语义更多“常规” -y。

  • 第二种选择的论点是,应该努力在begin - rescue子句中包含最少量(仅可能失败的)代码。

    < / LI>

就个人而言,我更喜欢第一个。