2016-09-28 2 views
1
class MyKlass 

    include ActiveSupport::Rescuable 

    rescue_from Exception do 
    return "rescued" 
    end 

    #other stuff 
end 

MyKlass - это чистый рубиновый объект, но определенный внутри Rails-приложения.Почему включение модуля Rescuable не работает?

Если я пытаюсь вызвать экземпляр MyKlass в консоли rails и затем применить к нему метод, который, безусловно, должен поднять Exception, ничего не произойдет, кроме ошибки, ожидаемой для спасения.

ответ

1

Вот как она должна быть использована:

class MyKlass 
    include ActiveSupport::Rescuable 
    # define a method, which will do something for you, when exception is caught 
    rescue_from Exception, with: :my_rescue 

    def some_method(&block) 
    yield 
    rescue Exception => exception 
    rescue_with_handler(exception) || raise 
    end 

    # do whatever you want with exception, for example, write it to logs 
    def my_rescue(exception) 
    puts "Exception catched! #{exception.class}: #{exception.message}" 
    end 
end 

MyKlass.new.some_method { 0/0 } 
# Exception catched! ZeroDivisionError: divided by 0 
#=> true 

Само собой разумеется, что спасение Exception является преступлением.

+0

Хотя я считаю, что проблема rescue_from заключается в том, что мне не нужно включать спасение в каждый метод. У меня есть 20 из них –

+0

, вы можете поместить логику спасения в один метод, который принимает блок и, чем любой другой метод, передает всю логику в качестве параметра этому методу. Но это выглядит грязным и бессмысленным. См. [Эту тему] (http://stackoverflow.com/questions/16567243/rescue-all-errors-of-a-specific-type-inside-a-module) для деталей реализации –

+1

поздравляю вас «поймали» это :) – engineersmnky

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