2012-08-12 11 views
6

La secuencia de comandos que escribí se ejecuta al inicio y requiere que se establezca una variable de entorno, pero ¿cuál de Ruby's Exceptions es la mejor? Utilicé LoadError, solo quiero ser lo más descriptivo posible y seguir las convenciones adecuadas.Ruby, ¿qué excepción es mejor para manejar las variables de entorno no establecidas?

En segundo lugar, no puedo encontrar otra manera de ver si se establece una variable de entorno además de verificar su longitud, pero eso no parece tan elegante.

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 
+0

ninguna razón para que no se limite a escribir su propio excepción? – muffinista

+0

Porque prefiero seguir una convención que es más popular si está disponible para mí. –

Respuesta

6

De acuerdo con la documentation for LoadError que se supone que se utilizará para cuando un 'requieren' tiene un problema. Creo que el método más apropiado sería crear la subclase StandardError y hacer una que se ajuste a su uso. Si eso parece un poco demasiado, simplemente me gustaría ir con StandardError con un mensaje descriptivo.

2

La fabricación de sus propias excepciones es fácil:

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

agarrar la excepción en ese bloque de código puede no ser apropiado en este caso, ya que parece que sólo está imprimiendo un mensaje con él. Como regla general, nunca haga una excepción a menos que esté preparado para finalizar el programa. En otras palabras, evite usar excepciones para las condiciones esperadas. Si el programa puede continuar sin FOO está estableciendo, sería mejor simplemente hacer que la ejecución de la instrucción del sistema condicional:

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

o

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

Usted puede hacer algo como:

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

Me gusta la simplicidad de esto, gracias! –

Cuestiones relacionadas