catch
意味着跳出深层嵌套的代码。在Java中,例如用于处理异常的Java try-catch
可以实现相同的功能,但它被认为是不好的解决方案,效率也非常低。在Ruby中处理异常我们有begin-raise-rescue
,我认为将它用于其他任务也是昂贵的。
Ruby的catch-throw
真的是一个比begin-raise-rescue
更有效的解决方案,还是有其他理由用它来破坏嵌套块而不是begin-raise-rescue
?
答案 0 :(得分:6)
除了作为失控结构的“正确”方法之外,catch-throw
也明显更快(在我的测试中快10倍)。查看this gist以获取我的代码和结果。
答案 1 :(得分:6)
Josh's answer是正确的。我想添加有关catch-throw
和raise-rescue
的更多信息。
catch-throw
用于流控制,而raise-rescue
用于异常/错误处理。不同的是:backtrace
(流量控制)不需要catch-throw
。相信我,导致raise-rescue
运行慢于catch-throw
10次Josh's gist的主要原因raise-rescue
需要花费大量时间来创建backtrace
对象。
如果您想在没有回溯的情况下raise
,请使用语法:
raise <type>, <message>, <backtrace>
结帐my gist。 raise without backtrace
比raise with backtrace
快得多。
2016年4月更新:
我已更新my gist: