¿Cómo rescatar a un evalu en Ruby?
exception rescue (2)
Brent ya obtuvo una respuesta que funciona , pero recomiendo rescatar el menor conjunto de excepciones con las que pueda salirse con la suya. Esto asegura que no estés engullendo accidentalmente algo que no pretendes ser.
Así,
begin
puts eval(good_str)
puts eval(bad_str)
rescue SyntaxError => se
puts ''RESCUED!''
end
Estoy intentando descubrir cómo rescatar los errores de sintaxis que surgen cuando evalúa el código en Ruby 1.8.6.
Esperaría el siguiente código de Ruby:
#!/usr/bin/ruby
good_str = "(1+1)"
bad_str = "(1+1" # syntax error: missing closing paren
begin
puts eval(good_str)
puts eval(bad_str)
rescue => exc
puts "RESCUED!"
end
para producir el siguiente resultado cuando se ejecuta:
2
RESCUED!
En cambio, lo que obtengo es:
2
eval_rescue.rb:8: (eval):1: compile error (SyntaxError)
(eval):1: syntax error, unexpected $end, expecting '')''
Parece que el SyntaxError generado por el método eval está siendo rescatado en algún lugar dentro de la evaluación, sin darme la oportunidad de manejarlo yo mismo.
¿Alguien tiene alguna idea de cómo obtener el comportamiento que quiero (es decir, que mi cláusula de ''rescate'' capte el error del ''eval'')?
Bueno, eso fue fácil ...
Resulta que, por defecto, la declaración de "rescate" no capta todas las excepciones, sino solo aquellas que son subclases de StandardError. SyntaxError es un hermano / primo de StandardError, no una subclase de él, por lo que la instrucción de rescate no lo captura a menos que explícitamente se lo indique.
Para que el bloque de rescate capture todas las excepciones, debe cambiar el código a lo siguiente:
#!/usr/bin/ruby
good_str = "(1+1)"
bad_str = "(1+1" # syntax error: missing closing paren
begin
puts eval(good_str)
puts eval(bad_str)
rescue Exception => exc
puts "RESCUED!"
end
Tenga en cuenta el cambio en la línea de "rescate", desde "rescue => exc" hasta "rescue Exception => exc".
Ahora, cuando ejecuta el código, obtiene los resultados deseados:
2
RESCUED!