2012-03-27 3 views
6

Ich versuche, Ausnahmen mit AOP in Ruby zu behandeln. Das Toolkit, das ich hier benutzt habe, ist Aquarium (http://aquarium.rubyforge.org/).SystemStackError in Ruby Exception Behandlung mit Aquarium (Aspektorientierte Programmierung)

Ich habe einen Beispielcode geschrieben, der versuchen wird, alle abgeleiteten Klassen (Unterklassen) der ApplicationController-Klasse abzubilden.

Beim Ausführen des folgenden Programms, erhalte ich einen SystemStackError (ich habe auch versucht, Stack-Limit mit "ulimit -s"). Jemand bitte hilf mir dabei! Oder irgendwelche Vorschläge zum Mapping: all_methods der Unterklassen einer Oberklasse sind willkommen. Vielen Dank im Voraus.

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

Ich bin nicht sicher gefunden werden, wenn dies das Problem ist, aber Sie sollten Standarderror erhöhen und retten, als Ausnahme ziemlich schwere Fehler enthalten kann. –

+0

Nein, auch das funktioniert nicht! –

+0

vielleicht können Sie so etwas http://apidock.com/rails/ActiveSupport/Rescuable/ClassMethods/rescue_from verwenden? – Fivell

Antwort

1

Sie haben beauftragt worden, ein Verfahren zu verwenden, die für Sprachen wie Java macht nur Sinn, dass Module nicht (oder Züge Scala)? Sie können dies ohne zusätzliche Arbeit erreichen, indem Sie das Modul, wo Sie es benötigen, mit self.send: include oder ähnlichem einbinden, solange Sie die Moduldatei benötigen.

In jedem Fall empfehle ich Ihnen Avdi Grimms Exceptional Ruby zu lesen, um zu verstehen, wie Ausnahmen in Ruby funktionieren - wieder nicht das gleiche wie Java - wie bereits erwähnt wurde.

Ruby braucht keine Abhängigkeitsinjektion - es ist völlig gegen die Philosophie der Sprache.

1

Sie könnten mein kleines Juwel verwenden - aspector, um dies auch zu erreichen.

Bei aspector sind Aspekte reguläre Ruby-Klassen, in denen Sie die Logik vor/nach/um die Methodenausführung definieren. Aspekte können unabhängig getestet und auf Klassen angewendet werden. Ich habe unten enthalten Codebeispiel, sondern ein komplettes Beispiel kann 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