我正在使用一些包含在 begin - rescue 块中的 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与上面的相同。是否有任何理由使得begin-rescue无法捕获此异常?
rescue
不会捕获Exception
的原因是,它们通常被认为过于严重而不适合被捕获。 - Andrew Grimm