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

lmyy7pcs  于 2023-03-03  发布在  Shell
关注(0)|答案(6)|浏览(102)

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

fruv7luv1#

您可以执行以下操作:

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

kuhbmx9i2#

根据documentation for LoadError,当一个“require”出现问题时,应该使用它。我认为更合适的方法是子类化StandardError,并创建一个适合您使用的子类。如果这看起来有点过分,我会使用StandardError并附带一个描述性消息。

vcirk6k6

vcirk6k63#

您自己的例外很容易:

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

ax6ht2ek4#

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

nzkunb0c

nzkunb0c5#

http://bugs.ruby-lang.org/projects/ruby/wiki/ExceptionClassesDoc中有一个异常类型列表
我可能会选择ArgumentError,因为ENV['FOO']的值不是您所期望的值。

5us2dqdw

5us2dqdw6#

您可以对块使用fetch来引发特定错误

ENV.fetch('FOO') { raise 'FOO environment variable is not set' }

相关问题