数据库约束会导致Ruby崩溃吗?我应该拯救它们吗?

时间:2018-03-15 02:45:48

标签: ruby-on-rails ruby database exception-handling

我正在阅读一篇文章,其中说所有异常都会导致Ruby崩溃。 http://blog.honeybadger.io/a-beginner-s-guide-to-exceptions-in-ruby/

我有一些数据库架构限制:

create_table :options_sets do |t|
    t.boolean :shared, :null => false
end

因此,当我创建一个违反约束的新options_set导致异常时,我不知道如何检查服务器是否已重新启动,但它看起来不像我。

OptionsSet.create()

错误消息:

ActiveRecord::StatementInvalid (PG::NotNullViolation: ERROR:  null value in column "shared" violates not-null constraint

我也多次读过"不应该预期例外"而且你不应该出于各种原因(比如竞争条件)完全依赖模型验证。所以在我看来,这是一个必须有时期望的例外。

那么,我应该拯救这个例外,还是应该以另一种方式处理?

2 个答案:

答案 0 :(得分:1)

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

  

那么,我应该拯救这个例外,还是应该以另一种方式处理?

您应该在模型中使用验证,以防止您达到数据库级异常。

答案 1 :(得分:0)

您在此处看到的异常是由错误的编程语句引起的异常。如果你有一个

OptionsSet.create()

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

OptionsSet.create(shared: some_expression_which_may_evaluate_to_nil)

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