Начать спасение, не обнаруживая ошибку

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

блок кода выглядит так:

# 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 не обработает это исключение?


person Schneems    schedule 02.07.2010    source источник


Ответы (2)


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

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

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

Спасение SignalException не позволяет программе правильно реагировать на сигналы. Его нельзя будет убить, кроме как kill -9.

person sepp2k    schedule 02.07.2010
comment
Причина, по которой rescue не спасает Exception по умолчанию, заключается в том, что они обычно считаются слишком серьезными для спасения. - person Andrew Grimm; 06.07.2010

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

person Suman Mukherjee    schedule 02.07.2010