Ruby/Избранное с RubyNews: различия между версиями

Содержимое удалено Содержимое добавлено
Строка 69:
 
Когда один из моих студентов занимался разработкой калькулятора на Ruby, то он столкнулся с одной интересной особенностью метода <code>eval</code>. В случае синтаксической ошибки в строке, переданой <code>eval</code> в качестве параметра, программа вылетала с ошибкой <code>SyntaxError</code>. Ниже идет пример, который демонстрирует эту ситуацию:
<codesource lang=ruby>begin
eval('2+2+')
rescue
p "error"
end</code>
Для контроля за ситуацией надо явно указать ошибку, которую вы хотите контролировать (в нашем случае <code>SyntaxError</code>).
<code>begin
eval('2+2+')
rescue SyntaxError
p "error"
end</codesource>
Для контроля за ситуацией надо явно указать ошибку, которую вы хотите контролировать (в нашем случае <code>SyntaxError</code>).
<source lang=ruby>begin
eval('2+2+')
rescue SyntaxError
p "error"
end</codesource>
Теперь все работает! Осталось только заметить, что если строка приходит из внешнего источника, то желательно ее предварительно проверить на соответствие вашим ожиданием. Иначе, вы будете кормить хакеров... :-) Как пояснил Yuri Leikind, этот эффект связан с тем, что rescue без параметра отлавливает ошибки выполнения программы (<code>Runtime Error</code>), а приведенный выше пример вызывает исключение (<code>Exception</code>). В общем, проблема все равно решается так, как я описал выше. :-)