Начните Спасение, не фиксирующее ошибку

Я использую некоторый код 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. Это сказанное я выполняю этот код в продуктивной среде и иногда когда я "получаю" электронное письмо (это выполняется от задачи граблей), он умирает с SyntaxError.

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

24
задан Schneems 2 July 2010 в 18:18
поделиться

2 ответа

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

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

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

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

47
ответ дан 28 November 2019 в 23:12
поделиться

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

3
ответ дан 28 November 2019 в 23:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: