在 Rails 中保存记录时抑制错误

Posted

技术标签:

【中文标题】在 Rails 中保存记录时抑制错误【英文标题】:Suppress an error when saving a record in Rails 【发布时间】:2015-02-27 10:12:46 【问题描述】:

我正在将数据保存到表中。

Question
  title:string
  author_id:integer
  description:text
  upvotes:integer

如果“question.upvotes”的值为1000000000000000000000,则会导致错误,因为它无法保存到“整数”类型列中。

如何抑制此错误?我希望我的程序继续运行,即使记录保存失败。

我试过了,但它并没有抑制错误:

... some code

if my_question.save
end

some more code...

【问题讨论】:

会导致什么错误?更新失败时你会看到什么? 你看过documentation for save吗? @NielsAbildgaard 这可能是一个处理 try / catch 语法的一般 Ruby 问题,而不是特定于活动记录 .save 方法 错误是PG::NumericValueOutOfRange: ERROR: value "1000000000000" is out of range for type integer 或者您可以只测试该值以查看它是否不会保存。也就是说,默默地未能满足用户的期望,也许其他程序员的期望不是一个好的通用设计原则。 【参考方案1】:
... some code

begin
  if my_question.save
    ...
  end
rescue
  # error handling
end

some more code ...

您收到ActiveRecord::StatementInvalid: PG::NumericValueOutOfRange: ERROR: integer out of range 错误。如果你想准确地捕捉到这个错误,你可以直接指定这个:

rescue ActiveRecord::StatementInvalid

您也可以添加一个将始终执行的块

ensure

You can find more about exceptions handling here/And see exceptions hierarchy here

【讨论】:

在 Rails 5.2 中 ActiveModel::RangeError 被提升。伙计,这让救援逻辑变得脆弱。【参考方案2】:

也许只是将该值固定为最大可能值?将这样的内容添加到您的 Question 模型中:

# app/models/question.rb
UPVOTE_MAX_VALUE = 2_147_483_647          # integer max value in postgresql
before_validation :check_upvote_max_size

private
def check_upvotes_max_size
  self.upvotes = UPVOTE_MAX_VALUE         if upvotes > UPVOTE_MAX_VALUE
end

【讨论】:

以上是关于在 Rails 中保存记录时抑制错误的主要内容,如果未能解决你的问题,请参考以下文章

在测试者的设备上部署应用程序无法在 iCloud 中保存记录

使用来自 grails 4.0.3 中的 rabbit mq 消费者的数据在服务层的数据库中保存记录的问题

在 rails 中保存单选按钮值

JDBCCRUD操作

如何抑制某些文件的 Intellisense 错误?

抑制php上的mysql错误