我从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
的行上会抛出错误。
如何实现?
答案 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
根据docs,try
就像常规的Ruby Object#send一样,如果在对象上定义了methos,那么它不会阻止像ArgumentError
和TypeError
这样的错误。< / p>