Начать спасение не поймать ошибку
Я использую какой-то код 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 не поймает это исключение?
Ответы
Ответ 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
, чтобы поймать все виды исключений.