2009-02-12 4 views
36

Я пытаюсь выяснить, как устранить синтаксические ошибки, возникающие при использовании кода eval() в Ruby 1.8.6.Как спасти eval в 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 

произвести следующий результат при запуске:

2 
RESCUED! 

Вместо того, что я получаю:

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

Оказывается что SyntaxError, поднятый методом eval, спасается где-то внутри eval, не давая мне шанса t o справитесь с этим сам.

У кого-нибудь есть идея, как получить поведение, которое я хочу (т. Е. Для моего предложения «rescue», чтобы уловить ошибку из «eval»)?

ответ

41

Ну, это было просто ...

Оказывается, что, по умолчанию, оператор «спасение» не ловит все исключения, но только те, которые являются подклассами StandardError. SyntaxError является братом/кузеном StandardError, а не его подклассом, поэтому оператор спасения не захватывает его, если явно не сказано.

Чтобы обеспечить улавливание спасательные BLOCK все исключения, вам нужно изменить код на следующее:

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

Обратите внимание на изменение в строке «спасения», от «спасения => отл» в «rescue Exception => exc».

Теперь, когда вы запустите код, вы получите желаемый результат:

2 
RESCUED! 
+0

Пожалуйста, смотрите это: http://stackoverflow.com/questions/10048173/why-is-it-bad-style-to-rescue-exception-e-in-ruby – gamov

45

Brent уже получил answer that works, но я рекомендую спасение от самого маленького набора исключений вы можете сойти с рук. Это гарантирует, что вы не случайно поглощаете то, что не хотите.

Таким образом,

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

Это хороший совет. Например, спасение Exception, а не SyntaxError, предотвратит прерывание вашего процесса ctrl-C. –

+0

Я удивлен, что это еще не стало лучшей практикой. – tamouse

 Смежные вопросы

  • Нет связанных вопросов^_^