2010-07-02 11 views
21

Sto utilizzando un codice ruby ​​racchiuso in un blocco begin-rescue ma in qualche modo riesce a bloccarsi.Begin Rescue not catching error

il blocco di codice simile a questo:

# 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 

Dato questo codice Parto dal presupposto che se process_message o add_to_processed_folder Impossibile eseguire poi soccorso sarebbe calci dentro e chiamare handle_bogus_message. Detto questo, sto eseguendo questo codice in un ambiente di produzione e talvolta quando "ottengo" un messaggio di posta elettronica (che viene eseguito da un'attività di rake), viene interrotto con un errore di sintassi .

Per uno sguardo al messaggio di errore check out http://pastie.org/1028479 e non che process_message che si riferisce è la stessa process_message sopra. C'è qualche motivo per cui iniziare - rescue non catturerà questa eccezione?

risposta

46

rescue senza un parametro salva solo le eccezioni ereditate da StandardError. Per salvare un SyntaxError utilizzare rescue SyntaxError.

per salvare tutte le eccezioni si usa rescue Exception, ma si noti che questa è una cattiva idea (che è il motivo per cui non è il comportamento predefinito di rescue), come spiegato here e here. Soprattutto questa parte:

Rescuing Interrupt impedisce all'utente di utilizzare CTRLC per uscire dal programma.

Rescuing SignalException impedisce al programma di rispondere correttamente ai segnali. Non sarà eseguibile se non per kill -9.

+5

Il motivo 'rescue' non salva' L'eccezione di default è che di solito sono considerate troppo severe per il salvataggio. –

3

rescue senza alcun parametro accetta eccezioni generate dalla classe StandardError. Il tuo tipo di errore è SyntaxError che viene ereditato da una classe diversa chiamata ScriptError. Tutte queste classi di errore sono sottoclassi di classe Exception. Quindi sepp2k suggerisce di usare rescue Exception per catturare tutti i tipi di eccezioni.