Ruby,哪个异常最好处理未设置的环境变量?

时间:2012-08-12 00:53:53

标签: ruby shell environment

我编写的脚本在启动时运行并要求设置一个环境变量,但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

5 个答案:

答案 0 :(得分:12)

您可以执行以下操作:

ENV['SECRET_KEY_XXYY'] || raise('no SECRET_KEY_XXYY provided')

答案 1 :(得分:7)

根据documentation for LoadError,当'require'出现问题时应该使用{{3}}。我认为更合适的方法是将StandardError子类化,并制作一个适合您使用的方法。如果这看起来有点多,我会跟StandardError一起使用描述性消息。

答案 2 :(得分:2)

制作自己的例外非常简单:

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'])

答案 3 :(得分:2)

http://bugs.ruby-lang.org/projects/ruby/wiki/ExceptionClassesDoc

上有一个例外类型列表

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

答案 4 :(得分:1)

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