70326


MySQL にアクセスする Ruby スクリプトで

[code]

    Mysql2::Error::TimeoutError: Lock wait timeout exceeded; try restarting transaction: ...
    
[/code]

のような例外が時々出るので

[code]

    mysql = ActiveRecord::Base.connection
    
    5.times do
      begin
        mysql.execute(query)
      rescue Mysql2::Error::TimeoutError => e
        puts 'failed. retry after 60 secs'
        sleep 60
        next
      end
      break
    end
    
[/code]

のようなリトライ処理を挟んでみたところ

例外発生箇所は  
`mysql.execute(query)`  
なんですが  
`rescue Mysql2::Error::TimeoutError => e`  
に引っかかってないようで 1 回で終了してしまいます

rescue に書く捉えたい例外クラス名はどうやって調べればいいのでしょうか


CC BY-SA 4.0
2020-09-09T09:35:52.127
70252
2020-09-12T05:20:36.417
2020-09-09T16:33:16.743
3060
question
ruby
rescue に書く例外クラスの調べ方


マニュアルに書いてなくてわからないなら、全ての例外のスーパークラスである`Exception`で捕捉して、クラス名を調べれば良いのではないでしょうか。

[code]

    class Foo < Exception; end
    class Bar < Foo; end
    
    begin
      raise Bar, "timeout"
    rescue Exception => e
      puts e.class # Bar
    end
    
[/code]

ついでにクラス階層を調べてみるとか。

[code]

    class Foo < Exception; end
    class Bar < Foo; end
    
    def puts_hierarchy(obj)
      klass = obj.class
      hierarchies = [klass]
      super_klass = klass.superclass
      while !super_klass.nil?
        hierarchies << super_klass
        super_klass = super_klass.superclass
      end
      puts hierarchies.join(' < ')
    end
    
    begin
      raise Bar, "timeout"
    rescue Exception => e
      puts_hierarchy(e) # Bar < Foo < Exception < Object < BasicObject
    end
    
[/code]


CC BY-SA 4.0
2020-09-12T05:20:36.417
70326
2020-09-12T05:20:36.417
7291
70252
answer