何时/为什么我想要在方法上引发异常?

时间:2012-05-01 21:32:19

标签: ruby-on-rails ruby

我注意到rails中的某些方法使用!运算符来引发异常(如果无效)。例如,User.create!

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

感谢。

2 个答案:

答案 0 :(得分:6)

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

  • 我可能想确保方法成功,但我不想在这里做任何实际的错误处理。但是,如果某些事情失败,我可能会对请求爆炸(例如生成HTTP 500)感到满意
  • 我可能希望在其他地方进行一些错误处理,例如在调用链中。一般来说,对于错误处理很长一段时间来说,拉出一些错误状态会更加冗长和讨厌。结构化错误处理,即begin ... rescue ... end使其更清晰。
  • 例外可以附加其他数据(例如错误消息)
  • 如果您有不同的错误类型,通常会更清楚地表示具有不同异常类而不是某些魔术ID值的那些(在C中很常见)

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

顺便说一下,save方法在内部调用save!,处理潜在的异常,如果有则返回false。有关实施,请参阅the code

答案 1 :(得分:4)

ActiveRecord will roll back a transaction if an exception is thrown while a transaction is active

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

针对特定内容,例如User.create

  • 您可以使用User.create方法确定用户提供的用户名是否尚未被选中,并提示用户选择其他名称(如果已经在使用中)。
  • 在最终提交请求时,您可以使用User.create!方法,以便在用户尝试绕过您的友好名称检查时,您的完整性检查可能无法创建并回滚事务。