【问题标题】:SystemStackError in Ruby Exception Handling using Aquarium(Aspect Oriented Programming)使用 Aquarium 处理 Ruby 异常中的 SystemStackError(面向方面​​的编程)
【发布时间】:2012-03-27 11:42:51
【问题描述】:

我正在尝试在 Ruby 中使用 AOP 处理异常。我在这里使用的工具包是 Aquarium(http://aquarium.rubyforge.org/)。

我编写了一个示例代码,它将尝试映射写下来的 ApplicationController 类的所有后代(子类)。

在执行以下程序时,我得到一个 SystemStackError(我还尝试使用“ulimit -s”设置堆栈限制)。有人请帮我解决这个问题!或者任何关于映射的建议:超类的子类的所有方法都欢迎..提前致谢。

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

【问题讨论】:

  • 我不确定这是否是问题所在,但您应该提出并挽救 StandardError,因为异常可能包括相当严重的错误。
  • 也许你可以使用类似apidock.com/rails/ActiveSupport/Rescuable/ClassMethods/…的东西?
  • @Fivell:是的,可以做到。但我被要求使用 AOP 而不是传统的方式。我还通过在创建 Aspect 时添加 :method_options => :exclude_ancestor_methods 选项解决了系统堆栈错误。
  • @Aravindan.ck: 所以现在可以使用 :exclude_ancestor_methods 选项?
  • @Fivell 是的,确实如此..n 抱歉回复晚了。

标签: ruby exception-handling aop


【解决方案1】:

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

无论如何,我建议您阅读 Avdi Grimm 的 Exceptional Ruby 以了解异常在 Ruby 中的工作方式 - 再次与 Java 不同 - 正如已指出的那样。

Ruby 不需要依赖注入——这完全违背了语言的哲学。

【讨论】:

    【解决方案2】:

    您也可以使用我的小宝石 - 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
    

    【讨论】:

      猜你喜欢
      • 2012-04-15
      • 2012-01-24
      • 2017-03-09
      • 1970-01-01
      • 2010-11-24
      • 2010-09-08
      • 1970-01-01
      • 2010-10-04
      • 2011-11-18
      相关资源
      最近更新 更多