2010-07-02 51 views
21

我使用一些包裹在开始 - 救援块中的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上方。是否有任何理由为什么开始 - 救援会不会发现此异常?

回答

46

rescue没有参数只是挽救从StandardError继承的异常。为了营救SyntaxError使用rescue SyntaxError

来救你会用rescue Exception所有异常,但请注意,这是一个坏主意(这就是为什么它不是rescue默认行为)作为解释herehere。尤其是这部分:

救援中断阻止用户使用CTRLC退出程序。

Rescuing SignalException阻止程序正确响应信号。除了kill -9之外,它将不可驱动。

+5

'rescue'并不拯救'Exception'的原因默认情况下是因为他们通常被认为太难救了。 – 2010-07-06 03:16:29

3

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