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-throw10 倍的主要原因是创建对象需要花费大量时间。raise-rescuebacktrace
如果您想raise不使用回溯,请使用语法:
raise <type>, <message>, <backtrace>
检查我的要点。raise without backtrace比 快得多raise with backtrace。
2016 年 4 月更新:
我已经更新了我的要点:
除了是摆脱控制结构的“正确”方式之外,它的catch-throw速度也明显更快(在我的测试中是 10 倍)。查看此要点以获取我的代码和结果。