在 model.save 或 model.save 中捕获数据库异常!方法?

Posted

技术标签:

【中文标题】在 model.save 或 model.save 中捕获数据库异常!方法?【英文标题】:Catching a database exception in a model.save or model.save! method? 【发布时间】:2010-07-24 01:35:25 【问题描述】:

我有两个模型,当保存某些类型的数据时,它会导致数据库抛出异常。我可以在保存之前转换数据以避免异常,但是转换成本高,异常很少发生。

所以,我想知道是否可以创建 model.save 方法的覆盖,并捕获从数据库中抛出的异常?这行得通吗?

例如:

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

我想这样做的原因是因为我已经不得不在有这个问题的两个模型之间重复大量的处理代码,并且还因为我想避免潜在的问题稍后在其他地方调用 save ,但不添加异常处理代码。

比如写一些测试代码,直接调用save的时候,错误数据抛出异常。

所以,有几个问题:

    甚至可以从保存或保存中捕获异常!方法? 修复数据后,如何再次尝试保存?我要再次调用 super() 吗? 有没有更好的处理方法?

非常感谢。

【问题讨论】:

【参考方案1】:

我不会覆盖保存的默认行为,我会简单地创建自己的方法。

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

【讨论】:

感谢您的想法,这肯定会奏效。问题是,这样做我必须依靠我记得调用该方法而不是保存或保存!。在我的测试中,默认情况下我使用了 save(),这导致异常被抛出,我重新审视这个问题,所以如果可能的话,我更愿意覆盖 save。有趣的是,我尝试覆盖 save() 并强制在测试中抛出异常,并且没有捕获到异常。考虑到我对通常会导致抛出异常的数据使用相同的测试,知道为什么会这样吗?再次感谢。 我在销毁时遇到了类似的问题...如果您在从覆盖函数中捕获(拯救)基类引发的异常方面取得了任何进展,请在此处发布:) 小心救援线上的额外“例外”。操作它时要小心,你必须确定接下来会发生什么。就像这里解释的那样:***.com/questions/10048173/…

以上是关于在 model.save 或 model.save 中捕获数据库异常!方法?的主要内容,如果未能解决你的问题,请参考以下文章

tf.saved_model.save(model, path_to_dir) 和 tf.keras.model.save 的区别

在 model.save() 中处理竞争条件

如何在 Mongoose 中等待 model.save()

model.save没有更新模型值

Django 在“model.save()”之后不更新 HTML 模板

通过 Model.save() 更新时触发 Mongoose 预保存挂钩