Ruby on Rails从'Errno :: ENOENT'救出

Kev*_*tre 6 ruby ruby-on-rails

我需要在Ruby on Rails 3.0.4应用程序中拯救'Errno :: ENOENT'.我目前有控制器,代码如下:

begin
  `lame #{parameters}`
rescue Errno::ENOENT
  logger.info "command 'lame' not found: ensure LAME is installed"
end
Run Code Online (Sandbox Code Playgroud)

但是,永远不会调用日志代码,但日志显示:

script/rails:没有这样的文件或目录 - 跛脚......

如果我使用相同的代码片段创建ruby脚本,则会获得异常.

wup*_*tah 5

在Ruby 1.8中,Errno::ENOENT不是由shell执行/反向标记引发的 - 您看到的错误是由shell打印的标准错误.如果你想检测这个,我建议你找一个127的退出代码:

`lame #{parameters} 2>&1`
if $?.exitstatus == 127
  logger.info "command 'lame' not found: ensure LAME is installed"
end
Run Code Online (Sandbox Code Playgroud)

但是,这将Errno::ENOENT在Ruby 1.9中引发.

您可以考虑which lame改为检查输出:

lame_installed = system("which lame >/dev/null")
# or even better
lame_available = !(lame_path = `which lame`.strip).empty? && File.executable?(lame_path)
Run Code Online (Sandbox Code Playgroud)

进一步阅读:

  • 看起来行为在1.9.x中发生了变化.你应该没有问题在Ruby 1.9.2-p136中将其作为例外进行抢救,但它在Ruby 1.8中不起作用. (3认同)