39 votes

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')?

50voto

James A. Rosen Points 25774

Brent a déjà obtenu une 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,

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

44voto

Brent Chapman Points 935

Eh bien, c'était facile...

Il s'avère que, par défaut, le "sauvetage" déclaration de ne pas attraper toutes les 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.

Pour avoir le sauvetage de bloquer la capture de toutes les exceptions, vous avez besoin de modifier le code de la manière suivante:

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

2
RESCUED!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X