我试图在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
答案 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