我在如下所示的Rails模型上用ruby编写了一个函数
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”无效
答案 0 :(得分:0)
在sorted_exp
方法中,未使用查询的输出。当使用调用的值时,Rails实际上执行对数据库的调用。在这种情况下,this的值可能已在其他函数中使用,并且错误从此处引发,指向此行: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:错误:函数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
块捕获了。