ruby-on-rails - 在控制台/rake/rails 中转义确保
问题描述
鉴于这样的事情
def infinite
puts Time.now
rescue => err
puts err.message
ensure
infinite
end
当你在控制台/rake 中运行它并点击 ctrl-c - 没有任何反应。你如何用 CTRL-C 来逃避这个?
解决方案
使用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
这样的条件在语义上是错误的,因为确保的重点是运行始终应该运行的代码。
推荐阅读
- angular-material-stepper - 如何在单击“下一步”时拨打电话并决定是否继续使用 CDKStepper?
- python - 在列中搜索 str 并创建新的项目列表
- ruby-on-rails - 如何根据数据库中的记录创建具有最少位数的 url 链接缩短 slug
- python-3.x - 从列表中删除一定百分比的元素,同时保留列表的结构完整性
- ant - ant如何检查驱动器D是否存在
- python - 在熊猫中编写文件比较
- c - **(x+i) 和 *(*x+i) 之间的区别
- c# - 无法将 Ioptions 传递给静态扩展方法或预热单例
- python - django 过滤 open_hours close_hours SyntaxError: positional argument follow于关键字参数
- dialogflow-es - Dialogflow 实现未在 Google Assistant 上显示建议