2012-03-27 17 views
6

Sto cercando di gestire le eccezioni utilizzando AOP in Ruby. Il toolkit che ho usato qui è Aquarium (http://aquarium.rubyforge.org/).SystemStackError in Ruby Exception Handling utilizzando Aquarium (programmazione orientata agli aspetti)

Ho scritto un codice di esempio che proverà a mappare tutti i discendenti (sottoclassi) della classe ApplicationController annotati.

Durante l'esecuzione del seguente programma, ottengo un SystemStackError (ho anche provato a impostare il limite dello stack usando "ulimit -s"). Qualcuno, per favore aiutami con questo! O qualsiasi suggerimento sulla mappatura: tutti i metodi di sottoclassi di una superclasse sono i benvenuti .. Grazie in anticipo.

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

Non sono sicuro se questo è il problema, ma si dovrebbe sollevare e salvare StandardError, come Eccezione può includere abbastanza gravi errori. –

+0

No, anche quello non funziona! –

+0

forse puoi usare qualcosa del genere http://apidock.com/rails/ActiveSupport/Rescuable/ClassMethods/rescue_from? – Fivell

risposta

1

Sei stato incaricato di utilizzare un metodo che ha senso solo per linguaggi come Java, che non hanno moduli (o tratti di Scala)? Puoi ottenerlo senza alcun lavoro extra includendo il modulo dove ti serve con self.send: include o simile, purché tu abbia richiesto il file del modulo.

In ogni caso, suggerisco di leggere Avy Grimm's Exceptional Ruby per capire come funzionano le eccezioni in Ruby - ancora una volta non come Java - come è stato sottolineato.

Ruby non ha bisogno di un'iniezione di dipendenza - è completamente contrario alla filosofia della lingua.

1

È possibile utilizzare la mia piccola gemma - aspector, per ottenere anche questo.

Utilizzando aspector, gli aspetti sono classi ruby ​​regolari, in cui viene definita la logica prima/dopo/attorno all'esecuzione del metodo. Gli aspetti possono essere testati in modo indipendente e applicati alle classi. Ho incluso codice di esempio qui sotto, ma un esempio completo può essere trovato 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 
Problemi correlati