如果我想同时挽救潜在的错误并抓住潜在的投掷,我该如何筑巢?这两个是否相同,这只是一个偏好的问题?
begin
catch(:some_throw) do
...
end
rescue SomeError
...
end
catch(:some_throw) do
begin
...
rescue SomeError
...
end
end
答案 0 :(得分:1)
这是一个基于意见的问题,人们可以争论。所以,在我看来......
如果您打算通过throw
返回值,那么第二个选项似乎很有用,因为它会让您rescue
出错并throw
某种默认值。
即使您使用throw
和catch
来管理循环迭代并在某些条件下突破它,第二个选项似乎仍然更具可读性并封装了{{1}内的所有逻辑阻止。
答案 1 :(得分:1)
它们并不完全等同。使用第一个备选方案时,catch
只会拦截begin
子句中抛出的值,而第二个包含来自rescue
的值。
话虽如此,如果您遇到这种情况,当两者相同时(也就是说您不在:some_throw
子句中抛出rescue
):
第一种选择的论点是我们倾向于认为begin
- rescue
块包含“常规”语句。 throw
- catch
很少使用并且具有非错误语义更多“常规” -y。
第二种选择的论点是,应该努力在begin
- rescue
子句中包含最少量(仅可能失败的)代码。
就个人而言,我更喜欢第一个。