使用带有require/rescue的单行条件

knu*_*nut 3 ruby require rescue

如果a require不成功,我想避免错误.

我可以这样做:

begin
  require 'unexisting_script' 
rescue LoadError
end
Run Code Online (Sandbox Code Playgroud)

我尝试用一​​行条件做同样的事情:

require 'unexisting_script' rescue LoadError
Run Code Online (Sandbox Code Playgroud)

并得到错误 no such file to load -- unexisting_script (LoadError)

使用其他异常/命令我对单行救援没有任何问题,这有效:

1 / 0 rescue ZeroDivisionError
Run Code Online (Sandbox Code Playgroud)

我也尝试将命令括起来,但是成功了:

(require 'unexisting_script') rescue LoadError
Run Code Online (Sandbox Code Playgroud)

我可以将所有内容放在一行中;:

begin require 'unexisting_script'; rescue LoadError; end
Run Code Online (Sandbox Code Playgroud)

但我仍然在想,为什么最短的版本不起作用.

我发现了一些相关的问题,但没有一个提到需要和救援的问题:

我的问题:

我可以rescue在一线条件下使用require吗?如果是的话:怎么样?如果不是:为什么?

saw*_*awa 9

rescue在postfix/oneliner表示法中使用时,不能指定错误类.什么rescue LoadErrorrescue ZeroDivisionError意味着它将拯救(子类)StandardError,在这种情况下,评估LoadErrorZeroDivisionError无效.由于它ZeroDivisionError是一个子类StandardError,它被捕获,但LoadError不是,它没有被捕获.

顺便说一句,我想不出一个用例,当你不想在所需文件存在时不提出错误.必需的文件是依赖项,如果要求它们失败,那么程序无论如何都无法正常工作.我觉得你在做什么的代码味道.如果加载文件失败并不会导致程序混乱,那通常是应该使用load而不是require.

  • @sawa:有时需要支持具有类似API的不同替代库.例如(当使用Ruby 1.8时)fastercsv和csv.如果没有,只需使用另一个.另一个用例是JSON库,例如[multi_json](https://github.com/intridea/multi_json/blob/master/lib/multi_json.rb#L53-L60). (3认同)
  • 用法:我的程序使用库导出为特殊格式.如果它不可用,我会给出消息"不支持导出格式XY" - 但仅限于某人请求它.在我的特殊情况下,如果相应的库不可用,我不希望任何人需要这种特定的导出格式.作为替代方案,我可以提前检查是否安装了库,但我认为更多的工作就是忽略加载错误. (2认同)