Comment sauver un eval en Ruby?
Je suis à essayer de comprendre comment sauver les erreurs de syntaxe qui nous viennent quand eval()
ing code en Ruby 1.8.6.
J'attendrais la suite du code 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
pour produire le résultat suivant lorsque vous exécutez:
2
RESCUED!
Au lieu de cela, ce que je reçois est:
2
eval_rescue.rb:8: (eval):1: compile error (SyntaxError)
(eval):1: syntax error, unexpected $end, expecting ')'
Il semble que la SyntaxError soulevées par la méthode eval est d'être secouru quelque part à l'intérieur de l'eval, sans me donner une chance de le gérer moi-même.
Quelqu'un a une idée de comment obtenir le comportement que je veux (c'est à dire, pour mon "sauvetage" clause d'intercepter l'erreur de l' 'eval')?
Vous devez vous connecter pour publier un commentaire.
Brent déjà obtenu un réponse qui fonctionne, mais je vous recommande de sauvetage du plus petit ensemble d'exceptions vous pouvez sortir avec. Cela permet de s'assurer que vous n'êtes pas accidentellement engloutir quelque chose que vous ne veux pas être.
Ainsi,
Bien, c'était facile...
Il s'avère que, par défaut, le "sauvetage" déclaration de ne pas attraper tous exceptions, mais seulement ceux qui sont des sous-classes de StandardError. SyntaxError est un frère ou une sœur/cousine de StandardError, pas une sous-classe, de sorte que le sauvetage de déclaration n'est pas saisie, sauf si explicitement dit.
Avoir le sauvetage bloc de capture tous exceptions, vous avez besoin de modifier le code de la manière suivante:
Noter le changement dans le "sauvetage" de la ligne, de "sauvetage => exc" pour "sauver Exception => exc".
Maintenant, lorsque vous exécutez le code, vous obtenez les résultats souhaités: