2011-06-16 2 views
15

У меня есть простой вопрос. У меня есть таблица соединений, которая имеет индекс, который гарантирует, что (col 1, col 2) уникален.спасение от Mysql2 :: Ошибка

Я добавляю в эту таблицу с использованием mysql2 gem и пытаюсь поймать Mysql2 :: Error, если попытка приводит к дублированию ключевой ошибки. Пока я получаю дублирующую ключевую ошибку, мой спасательный орган не выполняется.

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

Я получаю следующее сообщение об ошибке при выполнении self.foo << bar

mysql2 :: Ошибки: Дублирование записи '35455-6628' для ключа 'index_foos_bars_on_foo_id_and_bar_id': INSERT INTO foos_bars (foo_id, bar_id) VALUES (35455, 6628)

НО мое заявление о спасении не попадает! Исключение не будет успешно спасено. Что я делаю не так? Если я удалю Mysql2 :: Ошибка и спасет все, то это сработает. Но это плохая практика - я просто хочу избавиться от Mysql2 :: Error, которая в случае дублирования записи.

Спасибо,

+0

Вы проверили свой журнал, когда вы спасая все и убедились mysql2 :: Ошибка точно право капитализации и все для того, что бросают? – jdc

+0

Я зарегистрировал исключение и это тип Mysql2 :: Ошибка – deruse

ответ

18

Mysql2::Error теперь завернутые в другой класс исключений. Измените свой код на:

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

... и вы увидите реальный класс исключения, который вам нужно спасти.

Edit: Кажется, в этом случае оказалось ActiveRecord::RecordNotUnique

+7

ActiveRecord :: RecordNotUnique, спасибо! – deruse

+0

Добро пожаловать :) – smathy

+1

Это сработало спасибо. – Abram

Смежные вопросы