2011-06-16 2 views
15

J'ai une question simple. J'ai une table de jointure qui a un index qui s'assure que (col 1, col 2) est unique.rescatant de Mysql2 :: Erreur

J'ajoute à cette table en utilisant mysql2 gem et j'essaie d'attraper le Mysql2 :: Error si la tentative entraîne une erreur de clé en double. Pendant que je reçois l'erreur de clé en double, mon corps de secours n'est pas en cours d'exécution.

begin 
    self.foo << bar 
rescue Mysql2::Error 
    logger.debug("#{$!}") 
end 

Je reçois l'erreur suivante lors de l'exécution self.foo << bar

mysql2 :: Erreur: entrée en double '35455-6628' pour la touche 'index_foos_bars_on_foo_id_and_bar_id': INSERT INTO foos_bars (foo_id, bar_id) VALUES (35455, 6628)

MAIS ma déclaration de secours n'est pas touchée! L'exception n'est pas sauvée avec succès. Qu'est-ce que je fais mal? Si je supprime Mysql2 :: Error et sauvetage pour tout, alors cela fonctionne. Mais c'est une mauvaise pratique - je veux juste sauver de Mysql2 :: Error qui dans le cas d'une entrée en double.

Merci,

+0

Avez-vous vérifié votre journal lorsque vous sauvons tout et fait en sorte mysql2 :: erreur est exactement la capitalisation droite et tout pour ce qui est jeté? – jdc

+0

J'ai enregistré l'exception et il est de type Mysql2 :: Erreur – deruse

Répondre

18

Mysql2::Error est enveloppé dans une autre classe d'exception maintenant. Changez votre code pour:

begin 
    self.foo << bar 
rescue Exception => e 
    logger.debug "#{e.class}" 
end 

... et vous verrez la vraie classe d'exception que vous avez besoin de sauver.

Edit: Il semble dans ce cas, il est avéré être ActiveRecord::RecordNotUnique

+7

ActiveRecord :: RecordNotUnique, merci! – deruse

+0

Vous êtes les bienvenus :) – smathy

+1

Cela a fonctionné grâce. – Abram

Questions connexes