6

catch在 Ruby 中是为了跳出深度嵌套的代码。例如,在 Java 中,可以使用 Java 处理异常来实现相同的try-catch目的,但是它被认为是糟糕的解决方案,而且效率也很低。在 Ruby 中处理我们有的异常begin-raise-rescue,我认为将它用于其他任务也很昂贵。

那么Rubycatch-throw真的是一个更有效的解决方案,begin-raise-rescue还是有任何其他理由使用它来打破嵌套块而不是begin-raise-rescue?

4

2 回答 2

8

乔希的回答是正确的。我想添加更多关于catch-throw和的信息raise-rescue

catch-throw用于流量控制,而raise-rescue用于异常/错误处理。不同的是:backtrace不需要catch-throw(流量控制)。相信我,在Josh 的主旨raise-rescue中导致运行速度慢于catch-throw10 倍的主要原因是创建对象需要花费大量时间。raise-rescuebacktrace

如果您想raise不使用回溯,请使用语法:

raise <type>, <message>, <backtrace>

检查我的要点raise without backtrace比 快得多raise with backtrace

2016 年 4 月更新:

我已经更新了我的要点

  • 修复了“中断”测试
  • 为较新的 ruby​​ 版本 2.1.8、2.2.4、2.3.0 添加了基准测试结果
于 2013-06-26T05:53:35.713 回答
8

除了是摆脱控制结构的“正确”方式之外,它的catch-throw速度也明显更快(在我的测试中是 10 倍)。查看此要点以获取我的代码和结果。

于 2012-11-21T00:16:40.630 回答