2011-06-16 16 views
15

Mam proste pytanie. Mam tabelę sprzężenia, która ma indeks, który zapewnia, że ​​(col 1, col 2) jest unikalny.ratowanie z Mysql2 :: Błąd

Dodaję do tej tabeli przy użyciu gem mysql2 i próbuję złapać błąd Mysql2 ::, jeśli próba spowoduje błąd duplikatu klucza. Podczas gdy otrzymuję zduplikowany kluczowy błąd, moje ciało ratunkowe nie jest wykonywane.

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

Otrzymuję następujący błąd przy wykonywaniu self.foo << bar

Mysql2 :: Błąd: Duplikat wpis '35455-6628' dla klucza 'index_foos_bars_on_foo_id_and_bar_id': INSERT INTO foos_bars (foo_id, bar_id) VALUES (35455, 6628)

ALE moje oświadczenie ratunkowe nie zostało trafione! Wyjątek nie został pomyślnie uratowany. Co ja robię źle? Jeśli usunę Mysql2 :: Error i uratuje wszystko, to działa. Ale to jest zła praktyka - po prostu chcę uratować od Mysql2 :: Błąd, który w przypadku zduplikowanego wpisu.

Dzięki,

+0

Czy można sprawdzić swój dziennik podczas ratowania wszystko i upewnić się Mysql2 :: Błąd jest dokładnie prawo kapitalizacja i wszystko co jest do wyrzucenia? – jdc

+0

Mam zalogowany wyjątek i jest on typu Mysql2 :: Błąd – deruse

Odpowiedz

18

Mysql2::Error jest owinięty w innej klasy wyjątków teraz. Zmień swój kod na:

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

... a zobaczysz prawdziwą klasę wyjątków, którą musisz uratować.

Edycja: Wydaje się, że w tym przypadku okazała się ActiveRecord::RecordNotUnique

+7

ActiveRecord :: RecordNotUnique, dzięki! – deruse

+0

Nie ma za co :) – smathy

+1

To działało dzięki. – Abram

Powiązane problemy