8

我编写的脚本在启动时运行并要求设置环境变量,但是 Ruby 的Exceptions中哪个最好?我用过LoadError,我只是想尽可能地具有描述性并遵循适当的约定。

其次,除了检查环境变量的长度之外,我找不到其他方法来查看是否设置了环境变量,但这似乎并不那么优雅。

begin
  raise LoadError if ENV['FOO'].to_s.length == 0
  system "open http://example.com/" + ENV['FOO']
rescue Exception => e
  puts "=> #{e} FOO environment variable not set"
end
4

5 回答 5

14

您可以执行以下操作:

ENV['SECRET_KEY_XXYY'] || raise('no SECRET_KEY_XXYY provided')
于 2014-02-05T23:15:45.423 回答
8

根据LoadError 的文档,当“要求”出现问题时应该使用该文档。我认为更合适的方法是子类化StandardError并制作一个适合您使用的方法。如果这看起来有点多,我会StandardError使用描述性消息。

于 2012-08-12T01:04:32.893 回答
3

制作自己的例外很容易:

MyError = Class.new(StandardError)
raise MyError, "FOO environment variable not set" unless ENV['FOO']
system "open http://example.com/" + ENV['FOO']

在这种情况下,捕获该代码块中的异常可能不合适,因为您似乎只是在用它打印一条消息。通常,除非您准备好终止程序,否则永远不要引发异常。换句话说,避免对预期条件使用异常。如果程序可以在没有设置 FOO 的情况下继续,最好简单地使系统语句的执行有条件:

system("open http://example.com/" + ENV['FOO']) if ENV['FOO']

或者

ENV['FOO'] && system("open http://example.com/" + ENV['FOO'])
于 2012-08-12T03:55:35.747 回答
2

在http://bugs.ruby-lang.org/projects/ruby/wiki/ExceptionClassesDoc有一个异常类型列表

我可能会选择 ArgumentError ,因为您说的值ENV['FOO']不是您期望的值。

于 2012-08-12T23:20:39.193 回答
2

可以使用ENV.fetch('FOO')如果未找到,则会引发 KeyError。

于 2019-12-17T19:32:04.683 回答