开始救援没有捕获错误

时间:2010-07-02 18:18:38

标签: ruby-on-rails ruby error-handling rescue

我正在使用包含在begin-rescue块中的一些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 相同。是否有任何理由开始 - 救援不会捕获此异常?

2 个答案:

答案 0 :(得分:48)

没有参数的

rescue只会挽救从StandardError继承的异常。拯救SyntaxError使用rescue SyntaxError

要拯救您使用rescue Exception的所有例外情况,但请注意,这是一个坏主意(这就是为什么它不是rescue的默认行为),如here和{{3 }}。特别是这部分:

  

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

     

挽救SignalException会阻止程序正确响应信号。除了kill -9之外,它将是不可杀戮的。

答案 1 :(得分:3)

没有任何参数的

rescue接受StandardError类引发的异常。您的错误类型是SyntaxError,它继承自名为ScriptError的其他类。所有这些错误类都是Exception类的子类。因此,sepp2k建议使用rescue Exception来捕获各种异常。