5

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

我可以这样做:

begin
  require 'unexisting_script' 
rescue LoadError
end

我尝试对单行条件做同样的事情:

require 'unexisting_script' rescue LoadError

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

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

1 / 0 rescue ZeroDivisionError

我也尝试将命令括起来,但没有成功:

(require 'unexisting_script') rescue LoadError

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

begin require 'unexisting_script'; rescue LoadError; end

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

我发现了一些相关的问题,但没有一个提到 require 和 rescue 的问题:

我的问题:

我可以rescue在单线条件下使用require吗?如果是:如何?如果不是:为什么?

4

1 回答 1

10

rescue当您在后缀/oneliner 表示法中使用时,您不能指定错误类。什么rescue LoadErrorrescue ZeroDivisionError意味着它将拯救一个 (subclass of) StandardError,在这种情况下,评估LoadErroror ZeroDivisionError,它没有任何效果。因为ZeroDivisionError是 的子类StandardError,所以它被捕获,但LoadError不是,它没有被捕获。

顺便说一句,我想不出在所需文件不存在时不想引发错误的用例。所需文件是依赖项,如果需要它们失败,则程序无论如何都无法正常工作。我觉得你正在做的事情有代码味道。当加载文件失败不会弄乱程序时,通常应该load使用require.

于 2013-11-12T09:05:27.670 回答