2012-03-27 9 views
6

RubyでAOPを使用して例外を処理しようとしています。ここで使用したツールキットはAquarium(http://aquarium.rubyforge.org/)です。RubyでのSystemStackError Aquarium(Aspect Oriented Programming)を使用した例外処理。

書き留めた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 
+0

を見つけることができます。 –

+0

いいえ、それでも動作しません! –

+0

多分あなたはhttp://apidock.com/rails/ActiveSupport/Rescuable/ClassMethods/rescue_fromのようなものを使うことができますか? – Fivell

答えて

1

モジュール(またはScalaの特性)を持たないJavaなどの言語にのみ意味のあるメソッドを使用することを強制されましたか?モジュールファイルを必要とする限り、必要なモジュールをself.send:includeまたは同様のものに組み込むことで、余分な作業をすることなくこれを得ることができます。

いずれにしても、Avdi GrimmのExceptional Rubyを読んで、Rubyで例外がどのように機能するかを理解することをお勧めします - Javaと同じではありません - 指摘されています。

Rubyは依存性注入を必要としません。言語の哲学に完全に反します。

1

これを達成するために、私の小さな宝石 - aspectorを使用することもできます。

アスペクトを使用するアスペクトは通常のルビクラスで、メソッドの実行前後でロジックを定義します。アスペクトは独立にテストし、クラスに適用することができます。例外はかなり重大なエラーを含めることができるよう、私はこれが問題であるかどうかわからないんだけど、あなたははStandardErrorを上げ、救出する必要があり、私は次のコード例が含まれていましたが、完全な例は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 
関連する問題