从Mysql2::Error中恢复

18

我有一个简单的问题。我有一个联接表,它具有确保(col 1, col 2)唯一性的索引。

我正在使用mysql2 gem添加到该表中,并尝试捕获Mysql2 :: Error,如果尝试导致重复键错误。虽然我收到了重复键错误,但我的rescue代码块没有被执行。

begin
  self.foo << bar
rescue Mysql2::Error
  logger.debug("#{$!}")
end

执行self.foo << bar时出现以下错误:

Mysql2::Error:插入到foos_bars中时,由于键'index_foos_bars_on_foo_id_and_bar_id'上存在重复条目'35455-6628'而无法完成插入操作。

但是我的异常处理语句并没有执行!异常没有被成功捕获。我做错了什么?如果我删除Mysql2 :: Error并将其全部放在一个大的异常处理语句里,那么就可以正常工作。但那是不好的实践 - 我只想从Mysql2 :: Error中恢复,在遇到重复条目时。

谢谢!


你在恢复所有内容时是否检查了日志,并确保Mysql2 :: Error的大小写和被抛出的内容完全正确? - jdc
我已经记录了异常,它的类型是Mysql2::Error。 - deruse
1个回答

23

Mysql2::Error现在被包装在另一个异常类中。请更改您的代码为:

begin
  self.foo << bar
rescue Exception => e      # only for debug purposes, don't rescue Exception in real code
  logger.debug "#{e.class}"
end

...然后您将看到需要救援的真正异常类。

编辑:在这种情况下,它似乎是 ActiveRecord :: RecordNotUnique


3
最好救援StandardError而不是Exception:https://robots.thoughtbot.com/rescue-standarderror-not-exception - Kris
1
这只是调试代码,用于查看错误。虽然在这种特定情况下不太可能,但生成异常的代码可能已经引发了一个未从StandardError继承的错误,因此我仍然更喜欢为这些调试目的捕获Exception - smathy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接