开始救援没有捕获错误

Sch*_*ems 24 ruby error-handling ruby-on-rails rescue

我正在使用一些包含在开始 - 救援块中的红宝石代码,但不知怎的,它设法仍然崩溃.

代码块看起来像这样:

# 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
Run Code Online (Sandbox Code Playgroud)

鉴于此代码,我假设如果process_messageadd_to_processed_folder无法执行,那么rescue将启动并调用handle_bogus_message.话虽这么说,我在生产环境中运行此代码,有时当我"获取"电子邮件消息(这是从rake任务运行)时,它会死于SyntaxError.

一看错误消息退房http://pastie.org/1028479 并不算process_message,它指的是相同的process_message以上.是否有任何理由为什么开始 - 救援不会抓住这个例外?

sep*_*p2k 47

rescue没有参数只是拯救继承的异常StandardError.拯救一个SyntaxError用途rescue SyntaxError.

要拯救您将使用的所有异常rescue Exception,但请注意,这是一个坏主意(这就是为什么它不是默认行为rescue),如此此处所述.特别是这部分:

Rescuing Interrupt阻止用户使用CTRLC退出程序.

抢救SignalException会阻止程序正确响应信号.除了kill -9之外它将是不可杀死的.

  • "救援"的原因并没有拯救"默认情况下的例外情况",因为它们通常被认为太严重而无法救援. (5认同)