2011-06-16 14 views
15

Tengo una pregunta simple. Tengo una tabla de unión que tiene un índice que garantiza que (col 1, col 2) sea única.rescatando de Mysql2 :: Error

Estoy agregando a esa tabla usando la gema mysql2 y estoy intentando atrapar el Mysql2 :: Error si el intento da como resultado un error de clave duplicada. Mientras recibo el error duplicado de la llave, mi cuerpo de rescate no se está ejecutando.

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

Estoy recibiendo el siguiente error al ejecutar self.foo << bar

mysql2 :: Error: Duplicar entrada '35455 a 6628' para la llave 'index_foos_bars_on_foo_id_and_bar_id': INSERT INTO foos_bars (foo_id, bar_id) VALORES (35455, 6628)

PERO mi declaración de rescate no está siendo golpeada. La excepción no se rescatará con éxito de. ¿Qué estoy haciendo mal? Si elimino Mysql2 :: Error y rescato todo, entonces funciona. Pero esa es una mala práctica: solo quiero rescatar de Mysql2 :: Error que en el caso de una entrada duplicada.

Gracias,

+0

¿Ha comprobado su registro cuando estás rescatando todo y se aseguró mysql2 :: error es exactamente la capitalización derecha y todo por lo que está siendo lanzado? – jdc

+0

He registrado la excepción y es del tipo Mysql2 :: Error – deruse

Respuesta

18

Mysql2::Error se envuelve en otra clase de excepción ahora. Cambie su código a:

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

... y verá la verdadera clase de excepción que debe rescatar.

Editar: Parece que en este caso resultó ser ActiveRecord::RecordNotUnique

+7

ActiveRecord :: RecordNotUnique, gracias! – deruse

+0

De nada :) – smathy

+1

Esto funcionó gracias. – Abram

Cuestiones relacionadas