Начать спасение не ловя ошибку - PullRequest
25 голосов
/ 02 июля 2010

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

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

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

Ответы [ 2 ]

48 голосов
/ 02 июля 2010

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

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

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

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

3 голосов
/ 02 июля 2010

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

...