2

我注意到 Rails 中的某些方法使用!运算符在无效时引发异常。例如,User.create!

为什么以及何时要使用这样的东西?

谢谢。

4

2 回答 2

6

我可能出于各种原因想要例外

  • 我可能想确保该方法成功,但我不想在这里进行任何实际的错误处理。但是如果某些事情失败了,我可能会接受请求爆炸(例如产生 HTTP 500)
  • 我可能希望在其他地方进行一些错误处理,例如在调用链中的某个方式。通常,将一些错误状态拉到错误处理的道路上会更加冗长和讨厌。结构化的错误处理,即,begin ... rescue ... end使其更清晰。
  • 异常可以附加附加数据(例如错误消息)
  • 如果您有不同的错误类型,通常更清楚地表示那些具有不同异常类而不是一些神奇的 id 值(在 C 中很常见)

当错误状态数量很少并且在调用后直接完全处理时,有充分的理由不使用异常而是状态标志。但每一种技术都有它的位置和时间。

顺便说一句,该save方法在内部调用save!,处理潜在的异常并返回 false(如果有)。请参阅实现代码

于 2012-05-01T21:43:44.823 回答
4

如果在事务处于活动状态时抛出异常,ActiveRecord 将回滚事务

因此,抛出异常的方法可以很好地确保数据库在发生异常情况时不会提交事务。当您可以自己“处理”问题时——或者,如果它实际上不是问题——那么您可以使用不带 的变体!,检查返回值是否存在错误条件,然后自己处理它们。

对于特定的东西,例如User.create

  • 您可以使用该User.create方法来确定是否尚未选择用户提供的用户名,并提示用户选择另一个名称(如果已在使用中)。
  • 您可以User.create!在最终提交请求时使用该方法,以便您的完整性检查可以使创建和回滚事务失败,以防用户试图绕过您的友好名称检查。
于 2012-05-01T21:37:13.033 回答