У меня есть две модели, которые при сохранении определенных типов данных заставляют базу данных генерировать исключение. Я могу преобразовать данные перед сохранением, чтобы избежать исключения, но преобразование дорогое, и исключение происходит очень редко.Ловля исключения базы данных в файле 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
Причина, почему я хотел бы сделать это, потому что я уже должен был повторить большой кусок кода обработки между этими двумя моделями, которые имеют эту проблему, а также потому что я хотел бы избежать потенциальной проблемы вызова сохранения в другом месте позже, но не добавления кода обработки исключений.
Например, при написании некоторого тестового кода и прямого вызова, данные об ошибке вызывают исключение.
Итак, несколько вопросов:
- Это даже можно поймать исключение изнутри сохранить или сохранить! метод?
- После исправления данных, как я могу сохранить снова? Повторю ли еще вызов super()?
- Есть ли лучший способ справиться с этим?
спасибо.
Спасибо за идею, что определенно сработает. Дело в том, что я делаю это таким образом, я должен полагаться на свое запоминание, чтобы вызвать этот метод с помощью сохранения или сохранения !. В моем тестировании по умолчанию я пошел с save(), из-за которого было исключено исключение, и мне пришлось пересмотреть эту проблему, поэтому я предпочел бы переопределить сохранение, если это возможно. Интересно, что я попытался переопределить save() и заставить исключение быть брошенным в тест, и исключений не было. Любая идея, почему это может произойти, учитывая, что я использую тот же тест с данными, которые обычно вызывают исключение? Еще раз спасибо. – michaeldwp
У меня была аналогичная проблема с уничтожением ... если вы делаете какой-либо прогресс в том, чтобы поймать (освободить) исключения, поднятые базовым классом, с помощью функции переопределения, пожалуйста, разместите ее здесь :) –
Будьте осторожны с дополнительным «Исключением» при спасении линия. Всегда будьте осторожны, манипулируя им, вы должны быть уверены в следующем. Как описано здесь: http://stackoverflow.com/questions/10048173/why-is-it-bad-style-to-rescue-exception-e-in-ruby – lboix