不属于模特的例外情况

问题描述 投票:-1回答:1

我在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”无效

ruby-on-rails ruby activerecord
1个回答
0
投票

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块捕获。

© www.soinside.com 2019 - 2024. All rights reserved.