开始救援没有捕获错误
我正在使用一些包含在开始 – 救援块中的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无法执行,那么rescue将启动并调用handle_bogus_message 。 话虽如此,我在生产环境中运行此代码,有时当我“获取”电子邮件消息(这是从rake任务运行)时,它会死于SyntaxError 。
要查看错误消息,请查看http://pastie.org/1028479,而不是它所引用的process_message与上面的process_message相同。 是否有任何理由为什么开始 – 救援不会抓住这个例外?
没有参数的救援只会挽救从StandardError
inheritance的exception。 要解救SyntaxError
使用rescue SyntaxError
。
为了拯救所有exception你将使用rescue Exception
,但请注意,这是一个坏主意(这就是为什么它不是rescue
的默认行为),如此处和此处所述 。 特别是这部分:
Rescuing Interrupt阻止用户使用CTRLC退出程序。
挽救SignalException会阻止程序正确响应信号。 除了kill -9之外它将是不可杀戮的。
没有任何参数的rescue
接受StandardError类引发的exception。 您的错误类型是SyntaxError,它inheritance自名为ScriptError的其他类。 所有这些错误类都是Exception类的子类。 因此sepp2k建议使用rescue Exception
来捕获各种exception。