Ruby on Railsに限らずRubyで開発している際、
例外処理でbegin rescueを使います。
begin書いて、rescue => eで受け取る。
基本パターンで記憶していたため、
SidekiqのWorkerを開発中に例外処理方法がわからずわちゃわちゃしたのでその書き溜め。
sidekiqのワーカー内の例外処理ができない!
「sidekiq worker rescue not working」
「rails sidekiq perform rescue not working」
などなどGoogle検索してもとくに結果なし。。。
普通、例外処理を書く場合、
begin ~ rescue ~ endを使います。
1 2 3 4 5 |
begin hogehoge rescue => e puts "Error !! ${e.messages}" end |
sidekiqの場合、この方法だと例外を正しく処理することができず
謎のまま、リトライが繰り返される現象が起きます。
なので、正しいrescue方法は、beginを記述せず
メソッド全体に対してrescueを定義する方法で書きます。
1 2 3 4 5 6 |
def perform(id) hogehoge rescue => e Rails.logger.error("Worker error => #{e.message}") raise e end |
忘れちゃいけないことが、
rescueで例外をハンドリングしたら
最後、raise e で例外を発生させる必要があります。
そうしないと、実行できていないのにワーカーが正常終了しちゃいます。
1 2 3 4 5 6 |
def perform(id) hogehoge rescue => e Rails.logger.error("Worker error => #{e.message}") raise e #<= これ忘れずに!! end |
Sidekiqのアンチパターンの中にも
エラーの握り潰しをしないようにとあるので、そこは注意してね。
rescue => eは良い書き方じゃないです。
実際に書くときは、捕捉する例外は絞ってね。
sidekiqについて詳しくって人は公式をどうぞ。
じゃあね〜〜〜〜。