我正在使用包装在begin-救援块中的 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 。
要查看错误消息,请 checkout http://pastie.org/1028479,而不要检查它所引用的 process_message 与上面的 process_message 相同。有什么原因使开始-救援无法捕获此异常?
最佳答案
没有参数的rescue
只能挽救从StandardError
继承的异常。要救援SyntaxError
,请使用rescue SyntaxError
。
要挽救所有异常,您可以使用rescue Exception
,但是请注意,这是一个坏主意(这就是为什么它不是rescue
的默认行为)的原因,如here和here所述。特别是这部分:
关于ruby-on-rails - 开始救援未捕获错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3168160/