开始救援没有捕获错误

我正在使用一些包含在开始 – 救援块中的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_messageadd_to_processed_folder无法执行,那么rescue将启动并调用handle_bogus_message 。 话虽如此,我在生产环境中运行此代码,有时当我“获取”电子邮件消息(这是从rake任务运行)时,它会死于SyntaxError

要查看错误消息,请查看http://pastie.org/1028479,而不是它所引用的process_message与上面的process_message相同。 是否有任何理由为什么开始救援不会抓住这个例外?

没有参数的救援只会挽救从StandardErrorinheritance的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。