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

我可以这样做:

begin
  require 'unexisting_script'
rescue LoadError
end

我尝试对单行条件执行相同操作:
require 'unexisting_script' rescue LoadError

并得到错误no such file to load -- unexisting_script (LoadError)
除其他异常(exception)/命令外,我在单行救援方面没有问题,这可行:
1 / 0 rescue ZeroDivisionError

我也尝试在命令中加上括号,但取得了成功:
(require 'unexisting_script') rescue LoadError

我可以将所有内容与;放在一行中:
begin require 'unexisting_script'; rescue LoadError; end

但我仍然想知道,为什么最短的版本不起作用。

我发现了一些相关的问题,但是没有一个提到需求和救援的问题:
  • Why does this rescue syntax work?
  • How does one use rescue in Ruby without the begin and end block

  • 我的问题:

    我可以在rescue的单行条件下使用require吗?如果是:如何?如果没有:为什么?

    最佳答案

    当以postfix/oneliner表示法使用rescue时,不能指定错误类别。 rescue LoadErrorrescue ZeroDivisionError的意思是它将拯救StandardError(的子类),在这种情况下,评估LoadErrorZeroDivisionError无效。由于ZeroDivisionErrorStandardError的子类,因此已将其捕获,但未捕获LoadError,因此未捕获。

    顺便说一句,我想不出一个用例,当不需要的文件不存在时,您不希望引发错误。所需文件是依赖项,如果要求失败,则该程序将无法正常运行。我在做的事情中感觉到代码的味道。当加载文件失败不会使程序困惑时,通常是在应该使用load而不是require的情况下。

    10-07 12:09