ruby exception eval rescue

¿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!