18

簡単な質問があります。(col 1、col 2)が一意であることを保証するインデックスを持つ結合テーブルがあります。

mysql2 gemを使用してそのテーブルに追加し、試行の結果、キーの重複エラーが発生した場合にMysql2::Errorをキャッチしようとしています。キーの重複エラーが発生しているのに、レスキューボディが実行されていません。

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

実行時に次のエラーが発生しますself.foo << bar

Mysql2 :: Error:キー'index_foos_bars_on_foo_id_and_bar_id'の重複エントリ'35455-6628':INSERT INTO foos_barsfoo_idbar_id)VALUES(35455、6628)

しかし、私のレスキューステートメントはヒットしていません!例外は正常に救出されません。私は何が間違っているのですか?Mysql2 :: Errorを削除してすべてをレスキューすると、機能します。しかし、それは悪い習慣です-重複したエントリが発生した場合にMysql2::Errorから救出したいだけです。

ありがとう、

4

1 に答える 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

于 2011-06-16T16:54:40.507 に答える