我在ruby on rails模型中编写了一个函数,如下所示
def sorted_exp
begin
exp.order("currently_active = true DESC, TO_DATE(to_date, 'MM-DD-YYYY') DESC")
rescue
exp.order("currently_active = true DESC")
end
end
但是to_date
专栏中的条目很少,因为例外情况就像'2018年9月'。当我试图在model
中处理异常时,它失败了,并没有进入rescue
部分。我不知道为什么它没有在模型中捕获错误,以及它为什么不在救援部分返回查询。
提出的例外情况如下:
PG :: InvalidDatetimeFormat:错误:“MM”的值“se”无效
在sorted_exp
方法中,未使用查询的输出。当使用调用值时,Rails实际上执行对DB的调用。在这种情况下,它的值可能正在某些其他函数中使用,并且从那里引发错误,指向这一行:exp.order("currently_active = true DESC, TO_DATE(to_date, 'MM-DD-YYYY') DESC")
我不确定你的确切用例,但是在这个块中捕获异常的唯一方法是使用查询应该返回的值,比如计算返回的对象数量(再次,它取决于你的使用案件)。
例如,以下查询引发错误,尽管在begin..rescue
块中:
begin
User.order("TO_DATE(users.created_at, 'MONTH-YYYY') DESC")
rescue
puts "In rescue block"
end
这会引发以下错误:
ActiveRecord :: StatementInvalid:PG :: UndefinedFunction:ERROR:function to_date(没有时区的时间戳,未知)不存在
但是,当在begin
块本身中使用此查询的输出时,会捕获异常。例如:
begin
sorted_users = User.order("TO_DATE(users.created_at, 'MONTH-YYYY') DESC")
count = sorted_users.count
rescue
puts "In rescue block"
end
这个输出是:
在救援区
这是因为查询实际上是在begin
块本身中执行的,因此被我们的rescue
块捕获。