2013-03-15 3 views
1

Я пытаюсь выяснить, как сделать обратные вызовы EventMachine::Deferrable не создавать никаких исключений. Вместо того, чтобы begin ... rescue в каждом блоке обратного вызова, я пытаюсь обернуть блок как-то с вызовом метода, так что метод спасает исключение:ошибки при сбое в EventMachine :: Deferrable

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} 
} 

это не работает, конечно. Буду признателен за любую помощь.

ответ

0

В заявлении d.callback &f, to_proc вызывается. Исключение, которое вы пытаетесь поймать на d.succeed, невозможно поймать, потому что мы уже вне контекста вашей обработки исключений.

Я действительно не уверен, какую ошибку вы пытаетесь поймать. Если это ошибка в том, что вы делаете с EventMachine, вы можете создать #errBack, чтобы поймать их. Если вы действительно пытаетесь поймать исключения, которые происходят только в ваших обратных вызовах, то вы, вероятно, должны просто написать обработчики исключений в обратных вызовах (для конкретных исключений, которые вы ожидаете!).

Однако, если вы действительно хотите, чтобы поймать все ошибки во всех проки, вам необходимо изменить вызов в классе 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 

Я не рекомендую этот подход, однако

Смежные вопросы