Я использую некоторый код 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 выше. Есть ли какая-либо причина, почему начинаются - спасение не поймает это исключение?
rescue
без параметра просто спасает исключения, которые наследуются от StandardError
. Для спасения SyntaxError
используйте rescue SyntaxError
.
Чтобы спасти все исключения, вы можете использовать rescue Exception
, но обратите внимание, что это плохая идея (именно поэтому она не является поведением по умолчанию в rescue
), как объясняется здесь и здесь. Особенно эта часть:
Rescuing Interrupt предотвращает использование пользователем CTRLC для выхода из программы.
Rescuing SignalException не позволяет программе правильно реагировать на сигналы. Она будет неубиваемой, за исключением kill -9.
rescue
без какого-либо параметра принимает исключения, вызванные классом StandardError. Ваш тип ошибки - SyntaxError, который наследуется от другого класса под названием ScriptError. Все эти классы ошибок являются подклассами класса Exception. Поэтому, как предложил sepp2k, используйте rescue Exception
для перехвата всех видов исключений.