2010-07-24 2 views
4

У меня есть две модели, которые при сохранении определенных типов данных заставляют базу данных генерировать исключение. Я могу преобразовать данные перед сохранением, чтобы избежать исключения, но преобразование дорогое, и исключение происходит очень редко.Ловля исключения базы данных в файле model.save или model.save! метод?

Итак, мне было интересно, можно ли создать переопределение метода model.save и поймать исключение, которое выбрасывается из базы данных? Будет ли это работать?

Например:

def save 
    begin 
    super 
    rescue Exception => e 
    if e.is_a? ActiveRecord::StatementInvalid 
     # Do some processing and resave 
    end 
    end 
end 

Причина, почему я хотел бы сделать это, потому что я уже должен был повторить большой кусок кода обработки между этими двумя моделями, которые имеют эту проблему, а также потому что я хотел бы избежать потенциальной проблемы вызова сохранения в другом месте позже, но не добавления кода обработки исключений.

Например, при написании некоторого тестового кода и прямого вызова, данные об ошибке вызывают исключение.

Итак, несколько вопросов:

  1. Это даже можно поймать исключение изнутри сохранить или сохранить! метод?
  2. После исправления данных, как я могу сохранить снова? Повторю ли еще вызов super()?
  3. Есть ли лучший способ справиться с этим?

спасибо.

ответ

3

Я бы не переопределял поведение по умолчанию для сохранения, я бы просто создал свой собственный метод.

def save_with_exception_handler 
    begin 
    self.save! 
    rescue Exception => e 
    if e.is_a? ActiveRecord::StatementInvalid 
     # Do some processing and resave 
    end 
    end 
end 

Дайте ему лучшее имя, которое имеет смысл в вашем контексте, очевидно. Затем просто позвоните туда, где вы сейчас звоните. Save:

model_instance.save_with_exception_handler 
+2

Спасибо за идею, что определенно сработает. Дело в том, что я делаю это таким образом, я должен полагаться на свое запоминание, чтобы вызвать этот метод с помощью сохранения или сохранения !. В моем тестировании по умолчанию я пошел с save(), из-за которого было исключено исключение, и мне пришлось пересмотреть эту проблему, поэтому я предпочел бы переопределить сохранение, если это возможно. Интересно, что я попытался переопределить save() и заставить исключение быть брошенным в тест, и исключений не было. Любая идея, почему это может произойти, учитывая, что я использую тот же тест с данными, которые обычно вызывают исключение? Еще раз спасибо. – michaeldwp

+0

У меня была аналогичная проблема с уничтожением ... если вы делаете какой-либо прогресс в том, чтобы поймать (освободить) исключения, поднятые базовым классом, с помощью функции переопределения, пожалуйста, разместите ее здесь :) –

+0

Будьте осторожны с дополнительным «Исключением» при спасении линия. Всегда будьте осторожны, манипулируя им, вы должны быть уверены в следующем. Как описано здесь: http://stackoverflow.com/questions/10048173/why-is-it-bad-style-to-rescue-exception-e-in-ruby – lboix

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