Techioz Blog

以下をお勧めします。 インストール: Clang、GCC、Postgres、Redis

概要

Ruby の Concurrent::Future は例外をキャッチしていませんでした。そこで記事からコードをコピーしてレスキューブロックを追加しました。 しかし、今度はエラーが発生しました:

コードは次のとおりです。

executed_future = Concurrent::Future.execute do
            url = "#{endpoint}#{datum[:hierarchy_id]}#{valuation_date}"
            raise StandardError.new("Testing error!") # To test

            [...]
          end.rescue do | exception | # Adding this, will throw the error
            @exceptions << exception
            binding.pry # No activated
          end

私には何が欠けているのでしょうか?

Concurrent::Future ブロックで例外をレスキューすることを期待しています。まさに記事の通りです。

解決策

私は Concurrent::Future に詳しくないので、その特定の gem にレスキュー メソッドの別の実装が存在することを見逃してしまうかもしれません。

しかし、Rubyでは、レスキューは、別のメソッドの戻り値で呼び出すメソッドではありません(質問のConcurrent::Future.execute呼び出しの戻り値など)。現在のブロックのコンテキストで発生した例外をキャッチするキーワードです。

したがって、Concurrent::Future.execute ブロック内で Ruby の慣用的な begin …rescue … end 構文を使用してみます。

executed_future = Concurrent::Future.execute do
  begin
    url = "#{endpoint}#{datum[:hierarchy_id]}#{valuation_date}"
    raise StandardError.new("Testing error!") # To test
    # ...
  rescue StandardError => exception
    @exceptions << exception
    binding.pry
  end
end