catch
在 Ruby 中是为了跳出深度嵌套的代码。例如,在 Java 中,可以使用 Java 处理异常来实现相同的try-catch
目的,但是它被认为是糟糕的解决方案,而且效率也很低。在 Ruby 中处理我们有的异常begin-raise-rescue
,我认为将它用于其他任务也很昂贵。
那么Rubycatch-throw
真的是一个更有效的解决方案,begin-raise-rescue
还是有任何其他理由使用它来打破嵌套块而不是begin-raise-rescue
?
catch
在 Ruby 中是为了跳出深度嵌套的代码。例如,在 Java 中,可以使用 Java 处理异常来实现相同的try-catch
目的,但是它被认为是糟糕的解决方案,而且效率也很低。在 Ruby 中处理我们有的异常begin-raise-rescue
,我认为将它用于其他任务也很昂贵。
那么Rubycatch-throw
真的是一个更有效的解决方案,begin-raise-rescue
还是有任何其他理由使用它来打破嵌套块而不是begin-raise-rescue
?
乔希的回答是正确的。我想添加更多关于catch-throw
和的信息raise-rescue
。
catch-throw
用于流量控制,而raise-rescue
用于异常/错误处理。不同的是:backtrace
不需要catch-throw
(流量控制)。相信我,在Josh 的主旨raise-rescue
中导致运行速度慢于catch-throw
10 倍的主要原因是创建对象需要花费大量时间。raise-rescue
backtrace
如果您想raise
不使用回溯,请使用语法:
raise <type>, <message>, <backtrace>
检查我的要点。raise without backtrace
比 快得多raise with backtrace
。
2016 年 4 月更新:
我已经更新了我的要点:
除了是摆脱控制结构的“正确”方式之外,它的catch-throw
速度也明显更快(在我的测试中是 10 倍)。查看此要点以获取我的代码和结果。