2012-03-27 14 views
6

Estoy tratando de manejar excepciones usando AOP en Ruby. El kit de herramientas que he usado aquí es Aquarium (http://aquarium.rubyforge.org/).SystemStackError en Ruby Exception Handling using Aquarium (Programación Orientada a Aspectos)

He escrito un código de ejemplo que intentará mapear todos los descendientes (subclases) de la clase ApplicationController anotados.

Al ejecutar el siguiente programa, obtengo un SystemStackError (también intenté establecer el límite de la pila usando "ulimit -s"). ¡Por favor, que alguien me ayude con esto!. O cualquier sugerencia sobre el mapeo: todos los métodos de las subclases de una superclase son bienvenidos. Gracias de antemano.

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 
+0

No estoy seguro de si este es el problema, sino que debería subir y rescatar StandardError, como excepción puede incluir errores bastante graves. –

+0

¡No, incluso eso no funciona! –

+0

tal vez pueda usar algo como eso http://apidock.com/rails/ActiveSupport/Rescuable/ClassMethods/rescue_from? – Fivell

Respuesta

1

Usted ha recibido el mandato de utilizar un método que sólo tiene sentido para lenguajes como Java, que no tienen módulos (o rasgos de Scala)? Puede obtener esto sin ningún trabajo adicional al incluir el módulo donde lo necesita con self.send: include o similar, siempre que haya requerido el archivo del módulo.

En cualquier caso, le sugiero que lea Avdi Grimm's Exceptional Ruby para entender cómo funcionan las excepciones en Ruby, una vez más no es lo mismo que Java, como se ha señalado.

Ruby no necesita inyección de dependencia, es completamente contrario a la filosofía del lenguaje.

1

Puedes usar mi pequeña joya - aspector, para lograr esto también.

Usando aspector, los aspectos son clases regulares de ruby, en las que se define la ejecución del método de lógica antes/después/alrededor. Los aspectos se pueden probar de forma independiente y se pueden aplicar a las clases. He incluido ejemplo de código siguiente, pero un ejemplo completo se puede encontrar here

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 
Cuestiones relacionadas