我正在使用包装在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的默认行为)的原因,如herehere所述。特别是这部分:

关于ruby-on-rails - 开始救援未捕获错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3168160/

10-13 04:50