Подтвердить что ты не робот

Начать спасение не поймать ошибку

Я использую какой-то код ruby, завернутый в блок start-rescue, но каким-то образом ему удается все еще сбой.

блок кода выглядит следующим образом:

# Retrieve messages from server
def get_messages
  @connection.select('INBOX')
  @connection.uid_search(['ALL']).each do |uid|
    msg = @connection.uid_fetch(uid,'RFC822').first.attr['RFC822']
    begin
      process_message(msg)
      add_to_processed_folder(uid) if @processed_folder
    rescue
       handle_bogus_message(msg)
    end
    # Mark message as deleted 
    @connection.uid_store(uid, "+FLAGS", [:Seen, :Deleted])
  end
end

Учитывая этот код, я бы предположил, что если process_message или add_to_processed_folder не удалось выполнить, то спасение будет удалено и вызовет handle_bogus_message. При этом я запускаю этот код в производственной среде, а иногда, когда я получаю сообщение электронной почты (это выполняется из задачи rake), он умирает с SyntaxError.

Для просмотра сообщения об ошибке зайдите в http://pastie.org/1028479, а не process_message, что он ссылается на это тот же самый process_message. Есть ли причина, по которой begin - rescue не поймает это исключение?

4b9b3361

Ответ 1

rescue без параметра просто восстанавливает исключения, которые наследуются от StandardError. Чтобы спасти SyntaxError, используйте rescue SyntaxError.

Чтобы спасти все исключения, вы использовали бы rescue Exception, но обратите внимание, что это плохая идея (именно поэтому это не поведение по умолчанию rescue), как описано здесь и здесь. Особенно эта деталь:

Rescing Interrupt не позволяет пользователю использовать CTRLC для выхода из программы.

Rescuing SignalException предотвращает правильную реакцию программы на сигналы. Это будет unkilable, кроме как kill -9.

Ответ 2

rescue без каких-либо параметров принимает исключения, вызванные классом StandardError. Тип ошибки - SyntaxError, который наследуется от другого класса ScriptError. Все эти классы ошибок являются подклассами класса Exception. Так как sepp2k предложил использовать rescue Exception, чтобы поймать все виды исключений.