Ruby on rails DB约束是否会导致Ruby崩溃?我是否应该拯救它们?

Ruby on rails DB约束是否会导致Ruby崩溃?我是否应该拯救它们?,ruby-on-rails,ruby,database,exception-handling,Ruby On Rails,Ruby,Database,Exception Handling,我正在读一篇文章,上面说所有的异常都会导致Ruby崩溃。 我有一些DB模式约束: create_table :options_sets do |t| t.boolean :shared, :null => false end 因此,当我创建一个违反约束的新选项集,导致异常时,我不知道如何检查服务器是否已重新启动,但在我看来不是这样 OptionsSet.create() 错误消息: ActiveRecord::StatementInvalid (PG::NotNullViol

我正在读一篇文章,上面说所有的异常都会导致Ruby崩溃。

我有一些DB模式约束:

create_table :options_sets do |t|
    t.boolean :shared, :null => false
end
因此,当我创建一个违反约束的新选项集,导致异常时,我不知道如何检查服务器是否已重新启动,但在我看来不是这样

OptionsSet.create()
错误消息:

ActiveRecord::StatementInvalid (PG::NotNullViolation: ERROR:  null value in column "shared" violates not-null constraint
我也读过很多次“不应期望出现异常”,并且您不应出于各种原因(如竞争条件)完全依赖于模型验证。因此,在我看来,这是一个例外,有时必须预料到


那么,我是应该拯救这个异常,还是应该用另一种方式处理它呢?

Rails处理所有其他未处理的异常,并将它们转换为HTML错误页。Ruby不会仅仅因为未能挽救Rails应用程序中的异常而“崩溃”或重新启动

那么,我应该拯救这个异常,还是应该以另一种方式处理它


您应该在模型中使用验证来防止出现数据库级异常。

这里看到的异常是由错误的编程语句引起的。如果你有一个裸体

OptionsSet.create()
在您的代码中,此语句是错误,应该予以修复。不需要营救/处理任何事情。 但是,如果该异常可能由用户输入或其他程序状态引起,例如

OptionsSet.create(shared: some_expression_which_may_evaluate_to_nil)

然后,您应该处理异常,以允许应用程序向用户返回有意义的错误消息,从而允许用户更正输入。

感谢您的回复。这是否也意味着我根本不应该去拯救这种事情?我也有模型验证,不要拯救。与问题示例中的模型验证不同。为
validates:shared,presence:true
“您不应该因为各种原因(如竞争条件)而完全依赖模型验证”添加验证,虽然在某些情况下(在重载下)这可能是真的,但它肯定与这种情况无关。属性是否设置为非空值不是竞争条件,当然,除非共享布尔值基于某种逻辑,需要检查数据库以确认其共享性,并且您的容量非常大。基本上不是你现在需要关注的优化。只要验证它不是
nil
,您就可以注意到您的示例是模式级验证,而不是模型验证。在对其中一个答案的评论中,Chloe向您介绍了实际的模型验证语句“validates:shared,presence:true”。两者非常不同,处理方式也不同。