救援PG :: UndefinedTable而不是ActiveRecord :: StatementInvalid

时间:2016-01-08 09:21:06

标签: ruby-on-rails postgresql exception activerecord

例如,如果我尝试删除不存在的表,我将收到以下错误:

"#<ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation \"aiurea\" does not exist\n

我可以使用ActiveRecord::StatementInvalid从中拯救它,但它对我来说太通用了;我想只在底层错误为PG::UndefinedTable时进行救援。我怎么能这样做?

P.S。:我看到error.cause导致潜在的错误,但我不确定这是否是“公共”界面,并且它是一种不显眼的方式来实现它。

3 个答案:

答案 0 :(得分:3)

2018更新:

ex.original_exceptiondeprecated赞成ex.cause。这对我有用:

rescue ActiveRecord::StatementInvalid => ex
  if ex.cause.is_a?(PG::UndefinedTable)
    # do something
  else
    raise ex
  end
end

答案 1 :(得分:2)

Inner Join是一种特殊的错误类型,其中封装了其他错误。您可以使用ActiveRecord::StatementInvalid来访问原始版本:

.original_exception

更好的方法是:

rescue  ActiveRecord::StatementInvalid => ex
  ex.original_exception # this will return the `PG::UndefinedTable` class, which you can further inspect.
end

答案 2 :(得分:0)

这样的事情应该有效

rescue  ActiveRecord::StatementInvalid => ex
  if ex.message =~ /PG::UndefinedTable/
    // Do stuff here
  else
    raise ex
  end
end