首页 > 解决方案 > 在控制台/rake/rails 中转义确保

问题描述

鉴于这样的事情

def infinite
  puts Time.now
rescue => err
  puts err.message
ensure
  infinite
end

当你在控制台/rake 中运行它并点击 ctrl-c - 没有任何反应。你如何用 CTRL-C 来逃避这个?

标签: ruby-on-railsrubyruby-on-rails-4

解决方案


使用catch它作为替代控制流。

catch 执行它的块。如果未调用 throw,则该块正常执行,并且 catch 返回最后计算的表达式的值。

Ruby 在它的堆栈中搜索一个 catch 块,它的标记与 throw 具有相同的 object_id(符号几乎总是被用作具有相同的 object_id)。找到后,块停止执行并返回 val(如果没有给 throw 的第二个参数,则返回 nil)。

def infinate
  catch(:done) do
    begin 
      infinite
    rescue SystemExit, Interrupt => e
      puts e.message
      throw :done
    end
  end
end

使用ensure这样的条件在语义上是错误的,因为确保的重点是运行始终应该运行的代码。


推荐阅读