25

我正在使用一些包装在 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_messageadd_to_processed_folder无法执行,则救援将启动并调用handle_bogus_message。话虽如此,我在生产环境中运行此代码,有时当我“收到”一封电子邮件(这是从 rake 任务运行的)时,它会因SyntaxError而死。

要查看错误消息,请查看http://pastie.org/1028479 而不是它所指的process_message与上面的process_message相同。有什么理由开始-救援不会捕获这个异常吗?

4

2 回答 2

50

rescue没有参数只会挽救继承自StandardError. 抢救一SyntaxErrorrescue SyntaxError

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

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

救援 SignalException 会阻止程序正确响应信号。除非通过 kill -9,否则它将无法杀死。

于 2010-07-02T18:23:44.490 回答
3

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

于 2010-07-02T19:46:17.297 回答