2014-09-18 10 views
-1

Я хочу добавить обработчик исключений. Внутри класса у меня есть ряд методов, и я хочу добавить begin rescue end во все эти методы. Вместо добавления begin rescue end во все методы, могу ли я определить его в одном месте?Обработка исключений

+0

Ваша ситуация не достаточно ясна. – sawa

+0

Работа в одном и том же случае? –

ответ

1

Вы можете извлечь обработку ошибок в метод и вызвать его из всех других методов.

class Foo 
    def method1 
    with_exception_handling do 
     raise 'some error' 
    end 
    end 

    def method2 
    with_exception_handling do 
     puts "normal execution" 
    end 
    end 

    private 
    def with_exception_handling(&block) 
    begin 
     block.call 
    rescue => ex 
     puts "caught exception: #{ex.message}" 
    end 
    end 
end 

f = Foo.new 
f.method1 
f.method2 
# >> caught exception: some error 
# >> normal execution 
1

Я думаю, что в целом это не очень хорошая идея, чтобы иметь такую ​​широкую обработку исключений, поскольку это увеличивает вероятность того, что трудно обнаружить ошибки проскользнуть через ваши тесты и журналы ошибок. Однако, если у вас очень хороший прецедент, вы можете использовать method_missing, чтобы создать элегантный способ спасти каждый метод без изменения кода в каждом методе.

Если ваш метод

my_object.my_method 

Вы можете использовать method_missing, чтобы следующий синтаксис:

my_object.my_method_rescued 

например добавление _rescued к любому имени метода будет выполнять этот метод, завернутый в обработчике ошибок.

Это очень грубый пример, но это должно дать вам идею:

class MyClass 
    def my_method 
    raise 'error!!!' 
    end 

    def method_missing(method_name, *args) 
    if method_name.to_s.end_with? '_rescued' 
     rescue_wrapper(method_name[0..-9], *args) 
    end 
    end 

    private 
    def rescue_wrapper(method_name, *args) 
    begin 
     self.send(method_name, *args) 
    rescue => e 
     # Error handling code here... 
    end 
    end 

end 


my_object = MyClass.new 
my_object.my_method_rescued # => Calls error handling code on error 
my_ojbect.my_method # => Raises an exception on error 
+0

Или можно использовать некоторые метапрограммы для обертывания методов с обработкой ошибок. –

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