Ruby中的SystemStackError使用Aquarium进行异常处理(面向方面​​编程)

时间:2012-03-27 11:42:51

标签: ruby exception-handling aop

我试图在Ruby中使用AOP处理异常。我在这里使用的工具包是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 个答案:

答案 0 :(得分:1)

你被强制要求使用一种只对Java这样没有模块(或Scala的特征)的语言有意义的方法吗?只要您需要模块文件,就可以通过self.send:include或类似的方式将模块包含在您需要的地方,而无需任何额外的工作。

无论如何,我建议你阅读Avdi Grimm的Exceptional Ruby,了解异常如何在Ruby中运行 - 再次与Java不同 - 正如已经指出的那样。

Ruby不需要依赖注入 - 它与语言哲学完全相反。

答案 1 :(得分:1)

您可以使用我的小宝石 - aspector来实现这一目标。

使用aspector,方面是常规的ruby类,您可以在方法执行之前/之后/周围定义逻辑。方面可以独立测试,并应用于类。我在下面列出了代码示例,但可以找到一个完整的示例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