为什么.try方法会终止我的程序?

时间:2016-04-22 20:12:27

标签: ruby-on-rails ruby

我从params中捕获一个字符串日期,该日期应该是YYYY-DD-MM的形式。如果参数是无效日期,我希望将nil分配给minimum。就像参数是2013-40-50一样。我能够成功地做到:

minimum = Date.try(:parse, (params[:newer_than])) if params[:newer_than].present?

如果日期格式正确,则会将其分配给minimum,否则为nil。但是,在它是nil的情况下,程序终止并且我得到ArgumentError - 无效的日期。

我使用.try的整个想法是,如果它实际上失败了,那就没事了,继续前进。如果以后没有,我正在处理此案。分配给minimum的行上会抛出错误。

如何实现?

2 个答案:

答案 0 :(得分:2)

这就是你使用电话的方式。

try电话不像是开始/救援。它只是尝试调用该函数,如果它存在于该对象上。如果该功能不存在,没有大问题,它就不会调用该功能而只是继续。否则,它会调用它并按原样运行。

在这种情况下,调用try对您没有好处,因为您确定该函数存在于日期。发生了什么parse函数正在抛出错误。

你应该做的是继续在开始/救援块中调用Date.parse,并捕获parse函数可能抛出的那些特定错误(ArgumentError)。您还可以预先验证字符串(例如,使用正则表达式),以确保它在调用解析之前的格式正确。

无论哪种方式,parse都不会对您进行任何验证,因此您可以事先检查它或者开始/挽救它抛出的错误。

答案 1 :(得分:1)

您可以使用rescue作为目标:

minimum = begin
  Date.parse(params[:newer_than])
rescue ArgumentError, TypeError
  nil
end

根据docstry就像常规的Ruby Object#send一样,如果在对象上定义了methos,那么它不会阻止像ArgumentErrorTypeError这样的错误。< / p>