1

EventMachine::Deferrableコールバックで例外が発生しないようにする方法を見つけようとしています。すべてのコールバック ブロックを使用する代わりにbegin ... rescue、メソッド呼び出しで何らかの形でブロックをラップして、メソッドが例外をレスキューするようにしています。

require 'eventmachine'

def to_proc
  proc
rescue Exception => e
  puts "e=#{e}"
end

EventMachine::run {
  d = EventMachine::DefaultDeferrable.new
  f =  to_proc {raise 'error'}

  d.callback &f

  EventMachine.next_tick {d.succeed}
}

これはもちろん機能しません。助けていただければ幸いです。

4

1 に答える 1

0

ステートメントd.callback &fで、to_proc が呼び出されます。キャッチしようとしている例外はキャッチd.succeedできません。これは、既に例外処理のコンテキストの外にあるためです。

あなたがキャッチしようとしているエラーが実際にはわかりません。EventMachine の実行にエラーがある場合は、#errBackそれらをキャッチするために を作成できます。コールバックでのみ発生する例外を本当にキャッチしようとしている場合は、コールバックに例外ハンドラーを記述する必要があります (予想される特定の例外に対して!)。

ただし、本当にすべての proc ですべてのエラーをキャッチしたい場合は、クラス Proc で呼び出しをオーバーライドする必要があります。

# Note this code hasn't been tested and is only provided as an example
class Proc
  alias_method :old_call, :call
  def call(*args)
    begin
      old_call(*args)
    rescue Exception => e
      # Handle exception
    end
  end
end

ただし、このアプローチはお勧めしません

于 2013-03-15T22:32:01.070 に答える