Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ruby捕获抛出与效率_Ruby_Performance_Try Catch_Throw_Control Structure - Fatal编程技术网

ruby捕获抛出与效率

ruby捕获抛出与效率,ruby,performance,try-catch,throw,control-structure,Ruby,Performance,Try Catch,Throw,Control Structure,Ruby中的catch意味着跳出深度嵌套的代码。例如,在Java中,Java的try catch用于处理异常,可以实现同样的效果,但它被认为是糟糕的解决方案,效率也非常低。在Ruby中,我们有处理异常的begin-raise-rescue,我认为在其他任务中使用它也是非常昂贵的 Ruby的catch-throw真的是一个比begin-raise-rescue更有效的解决方案吗?或者是否有其他理由使用它来打破嵌套块而不是begin-raise-rescue?除了是摆脱结构控制的“正确”方式之外,c

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

Ruby的
catch-throw
真的是一个比
begin-raise-rescue
更有效的解决方案吗?或者是否有其他理由使用它来打破嵌套块而不是
begin-raise-rescue

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

是正确的。我想添加更多关于
抓球投掷
提升救援
的信息

catch-throw
用于流量控制,而
raise-rescue
用于异常/错误处理。不同的是:
catch-throw
不需要
backtrace
(流量控制).相信我,主要原因是
raise-rescue
运行速度比
catch-throw
慢10次,这是
raise-rescue
创建
backtrace
对象需要很多时间

如果要在无回溯的情况下提升,请使用以下语法:

raise <type>, <message>, <backtrace>
raise,
签出。
raisewithbacktrace
raisewithbacktrace
快得多

2016年4月更新:

我更新了:

  • 固定的“中断”测试
  • 为更新的ruby版本2.1.8、2.2.4、2.3.0添加了基准测试结果

如果您发布了一些ruby控件结构示例,您可能会更清楚您的意思。谢谢!基准测试确实解决了这个问题(在我的例子中,它几乎是15倍!)。catch-throw应该被认为是一种结构化的编程风格吗?一种更好的实践,而不是被轻视的goto?因为你的设计需要catch-throw,可能有一种更好的设计。也就是说,肯定有一些边缘情况下catch-throw很有意义,特别是在gem开发中,你不知道最终用户会如何使用它。Tha感谢所有的解释!