SystemStackError в обработке исключений Ruby с использованием Aquarium (Аспектно-ориентированное программирование) - PullRequest
6 голосов
/ 27 марта 2012

Я пытаюсь обработать исключения, используя AOP в Ruby.Я использовал здесь инструментарий Aquarium (http://aquarium.rubyforge.org/).

. Я написал пример кода, который попытается отобразить все записанные потомки (подклассы) класса ApplicationController.

При выполнении следующей программыЯ получаю SystemStackError (я также пытался установить ограничение стека с помощью "ulimit -s"). Кто-нибудь, пожалуйста, помогите мне с этим!. Или любые предложения по отображению: приветствуются all_methods подклассов суперкласса. Заранее спасибо.

require 'aquarium'

include Aquarium::Aspects

class ApplicationController
end

class Abc < ApplicationController
    def func
        puts "func called"
        raise Exception.new # SystemStackError is thrown before reaching place
    end     
end

    #Dummy class
class Def < ApplicationController
end

Aspect.new :after_raising => Exception,
    :in_types_and_descendents => "ApplicationController" do |jp, object, *args|
        puts "Exception Handling Code"
end

a = Abc.new
a.func

Ответы [ 2 ]

1 голос
/ 22 июня 2012

Вы можете использовать мой маленький драгоценный камень - aspector , чтобы добиться этого тоже.

Используя aspector, аспекты представляют собой обычные классы ruby, в которых вы определяете логику до / после / вокруг выполнения метода.Аспекты могут быть проверены независимо, и могут быть применены к классам.Я включил пример кода ниже, но полный пример можно найти здесь

class ExceptionHandler < Aspector::Base
  around options[:methods] do |proxy, *args, &block|
    begin
      proxy.call *args, &block
    rescue Exception => e
      puts "Exception Handling Code"
    end
  end
end

ExceptionHandler.apply Abc, :methods => Abc.instance_methods

a = Abc.new
a.func
1 голос
/ 15 апреля 2012

Вам было поручено использовать метод, который имеет смысл только для таких языков, как Java, у которых нет модулей (или черт характера Scala)?Вы можете получить это без какой-либо дополнительной работы, включив модуль, где вам это нужно, с помощью self.send: include или аналогичного, если вам требуется файл модуля.

В любом случае я предлагаю вам прочитать AvdiИсключительный Ruby от Grimm, чтобы понять, как исключения работают в Ruby - опять-таки, не то же самое, что Java - как уже отмечалось.

Ruby не требует внедрения зависимостей - это полностью противоречит философии языка.

...