0

Следующая функция может возвращать значение null, поэтому я хочу использовать поток исключений. Может ли кто-нибудь направить меня на правильный способ сделать это, потому что сейчас я получаю ошибку.ruby ​​raise exception on iterator

синтаксическая ошибка, неожиданный keyword_else, ожидая keyword_end еще

def value_from_table1(field, key) 
    begin 
     @@connection.query("SELECT #{field} FROM table1 Where key = #{key} ").each do |row| 
     rescue Exception=>e 
      puts e 
     else 
      return row[field] 
     end 
    end 
end 
+0

Вам следует избегать ваших параметров запроса. –

+1

Если вы берете поток ошибок, вы должны обернуть выражение 'row [field]'. См. http://phrogz.net/programmingruby/tut_exceptions.html – sschmeck

+0

Почему бы просто не возвращать перечислимый объект (то есть объект, который отвечает каждому), тогда нет никаких проблем. Также прямо сейчас, если есть несколько строк, вы получите только первый, который кажется неправильным, но я не уверен, что вы пытаетесь сделать. – engineersmnky

ответ

0

Вы передаете блок Enumerator#each, который вводит новую область, так что вам нужно поставить begin как начало блока исключений внутри ,

Если вам также нужны исключения для обработки от @@connection.query, просто положите rescue после do-end блоком. begin подразумевается в начале тела метода.

0

Во-первых, спасение от Исключения всегда плохая идея, см. Why is it a bad style to `rescue Exception => e` in Ruby? для деталей.

Второй начать спасательный блок всегда должен иметь конец закрытия, иначе возможно только после того, если перед

begin 
    # ... 
rescue StandardError => e 
    # ... 
end 

В-третьи, как уже сказал Джастин Тернер в комментариях, просто передавая значение в БД Это делает его склонным к инъекциям SQL. Есть ли причина, по которой вы не используете ActiveRecord, но хотите получить прямой доступ к БД?

В целом есть много вопросов с этой короткой частью кода, я бы предложил прочитать http://guides.rubyonrails.org/, чтобы лучше понять, что происходит.

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