2010-07-02 17 views
21

Estoy usando un código de rubí envuelto en un bloque de begin - rescue pero de alguna manera se bloquea.Begin Rescue no detecta error

el bloque de código es el siguiente:

# 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 

Teniendo en cuenta este código que supongo que si process_message o add_to_processed_folder no pudo ejecutar a continuación de rescate se sacudía y llamar handle_bogus_message. Dicho esto, estoy ejecutando este código en un entorno de producción y, a veces, cuando obtengo un mensaje de correo electrónico (se ejecuta desde una tarea de rake), muere con SyntaxError.

Para un vistazo al mensaje de error echa un vistazo a http://pastie.org/1028479 y no la process_message que se refiere es el mismo process_message anteriormente. ¿Hay alguna razón por la cual comienza - rescatar no detectará esta excepción?

Respuesta

46

rescue sin un parámetro solo rescata las excepciones que heredan de StandardError. Para rescatar un SyntaxError, use rescue SyntaxError.

Para rescatar todas las excepciones que usaría rescue Exception, pero tenga en cuenta que eso es una mala idea (que es por qué no es el comportamiento por defecto de rescue) como se explica here y here. Especialmente esta parte:

La interrupción de rescate impide que el usuario utilice CTRLC para salir del programa.

Rescatar SignalException impide que el programa responda correctamente a las señales. Será inacabable excepto por kill -9.

+5

La razón por la que 'rescue' no rescata' Exception's por defecto es que generalmente se consideran demasiado severos para rescatarlos. –

3

rescue sin ningún parámetro acepta excepciones planteadas por la clase StandardError. Su tipo de error es SyntaxError que se hereda de una clase diferente llamada ScriptError. Todas estas clases de error son subclases de la clase Excepción. Entonces, como sepp2k sugirió utilizar rescue Exception para detectar todo tipo de excepciones.

Cuestiones relacionadas