2010-07-02 7 views
21

J'utilise du code ruby ​​enveloppé dans un bloc de début - sauvetage mais de toute façon il parvient toujours à se bloquer.Début Rescue ne pas attraper l'erreur

le bloc de code ressemble à ceci:

# 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 

Compte tenu de ce code, je suppose que si process_message ou add_to_processed_folder n'a pas pu exécuter alors le sauvetage et se lancer appeler handle_bogus_message. Cela étant dit, je cours ce code dans un environnement de production et parfois quand je "reçois" un message électronique (ceci est exécuté à partir d'une tâche rake), il meurt avec un SyntaxError.

Pour un coup d'oeil à l'erreur un message consulter http://pastie.org/1028479 et non que process_message qu'il fait référence est le même process_message ci-dessus. Y at-il une raison pour laquelle commencer - sauvetage ne sera pas attraper cette exception?

Répondre

46

rescue sans un paramètre sauve seulement les exceptions qui héritent de StandardError. Pour sauver un SyntaxError, utilisez rescue SyntaxError.

Pour sauver toutes les exceptions que vous utiliseriez rescue Exception, mais notez que c'est une mauvaise idée (ce qui est la raison pour laquelle ce n'est pas le comportement par défaut de rescue) comme expliqué here et here. En particulier cette partie:

L'interruption de secours empêche l'utilisateur d'utiliser CTRLC pour quitter le programme.

Rescuing SignalException empêche le programme de répondre correctement aux signaux. Ce sera inutilisable sauf par kill -9. Sans aucun paramètre accepte les exceptions levées par la classe StandardError

+5

La raison pour laquelle 'rescue' ne sauve pas' Exception's par défaut est qu'ils sont généralement considérés comme trop sévères pour être sauvés. –

3

rescue Votre type d'erreur est SyntaxError qui est hérité d'une classe différente appelée ScriptError. Toutes ces classes d'erreurs sont des sous-classes de la classe Exception. Donc, comme sepp2k suggéré d'utiliser rescue Exception pour attraper toutes sortes d'exceptions.

Questions connexes