Comment sauver un eval en Ruby?

J’essaie de comprendre comment récupérer les erreurs de syntaxe qui surviennent lorsque eval() ing code dans Ruby 1.8.6.

Je m’attendrais au code Ruby suivant:

 #!/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 

pour produire le résultat suivant lors de l’exécution:

 2 RESCUED! 

Au lieu de cela, ce que je reçois est:

 2 eval_rescue.rb:8: (eval):1: comstack error (SyntaxError) (eval):1: syntax error, unexpected $end, expecting ')' 

Il semble que SyntaxError déclenché par la méthode eval soit récupéré quelque part dans l’eval, sans me donner la chance de le gérer moi-même.

Quelqu’un a-t-il une idée de la façon d’obtenir le comportement que je veux (c.-à-d. Pour que ma clause de «sauvetage» détecte l’erreur de «l’évaluation»)?

Brent a déjà une réponse qui fonctionne , mais je recommande de sauver le plus petit ensemble d’exceptions possible. Cela garantit que vous ne gobez pas accidentellement quelque chose que vous ne voulez pas être.

Ainsi,

 begin puts eval(good_str) puts eval(bad_str) rescue SyntaxError => se puts 'RESCUED!' end 

Eh bien, c’était facile …

Il s’avère que, par défaut, l’instruction “rescue” n’attrape pas toutes les exceptions, mais uniquement celles qui sont des sous-classes de StandardError. SyntaxError est un frère / cousin de StandardError, et non une sous-classe de celui-ci, de sorte que l’instruction de secours ne le capture pas, sauf indication contraire.

Pour que le bloc de secours capture toutes les exceptions, vous devez modifier le code comme suit:

 #!/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 

Notez la modification de la ligne “rescue”, de “rescue => exc” à “rescue Exception => exc”.

Maintenant, lorsque vous exécutez le code, vous obtenez les résultats souhaités:

 2 RESCUED!