Поймать исключение базы данных в model.save или model.save!метод? - PullRequest
4 голосов
/ 24 июля 2010

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

Итак, мне было интересно, возможно ли создать переопределение метода 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. Есть ли лучший способ справиться с этим?

Большое спасибо.

1 Ответ

3 голосов
/ 24 июля 2010

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

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

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

model_instance.save_with_exception_handler
...