Dean, Under ruby 1.8.5 (2006-08-25) [x86_64-linux], Aquarium 0.4.3 appears to append join point information to exceptions thrown in advised methods. For example, the small program beneath my sig generates 12k of output (attached), mostly the stderr dump of "(joinpoint = JoinPoint: ...)". It also appears to prepend information about about which advice it was in when the exception was processed. Both the appending and the prepending violate my first-blush expectations. In particular, the appending makes deciphering app errors quite difficult, as the exception is too large for the eye. Are my expectations wrong? Is this behavior normal or perhaps even desirable? Have I inflicted this on myself by API misuse or similar? Thanks. Regards, ---- $ cat aquarium-exc.rb #!/usr/bin/env ruby require 'rubygems' require 'aquarium' class A def foo raise "Aiiiieeeeeeeeeeeee" end end Aquarium::Aspects::Aspect.new :around, :calls_to => 'foo', :in_type => A do |jp, obj, *args| jp.proceed end puts "ruby #{RUBY_VERSION}" puts "aquarium #{Aquarium::VERSION::STRING}" A.new.foo $ ruby aquarium-exc.rb > /tmp/stdout-and-stderr 2>&1 The stdout and stderr output: aquarium-exc.rb:8:in `_aspect_saved_A_foo': Exception raised while executing "around" advice for "A#foo": Exception raised while executing "around" advice for "A#foo": Aiiiieeeeeeeeeeeee (join_point = JoinPoint: {target_type = A, target_object = nil, method_name = foo, instance_method? true, context = #, @progname=nil, @logdev=#, @dev=#, @shift_size=nil, @shift_age=nil, @filename=nil>, @level=2, @formatter=nil>}>, @join_points=#, @types_and_ancestors=#, @types_and_nested_types=#, @next_node=#}>, @exclude_pointcuts=#, @exclude_methods=#, @method_options=#, @types_and_descendents=#, @last_advice_kind=[:around], @exclude_types_and_descendents=#, @pointcuts=#, @ignore_no_matching_join_points=#, @exclude_types_calculated=[], @exclude_types=#, @attributes=#, @exclude_named_pointcuts=#, @types=#, @aspect=Aspect: {specification: {:types_and_descendents=>#, :types=>#, :advice=>#, :methods=>#, :default_objects=>#, :types_and_ancestors=>#, :exclude_pointcuts=>#, :exclude_types=>#, :named_pointcuts=>#, :exclude_types_and_ancestors=>#, :objects=>#, :exceptions=>#, :exclude_join_points=>#, :join_points=>#, :ignore_no_matching_join_points=>#, :method_options=>#, :exclude_named_pointcuts=>#, :exclude_types_calculated=>[], :noop=>#, :exclude_objects=>#, :exclude_types_and_nested_types=>#, :types_and_nested_types=>#, :logger=>#, @progname=nil, @logdev=#, @dev=#, @shift_size=nil, @shift_age=nil, @filename=nil>, @level=2, @formatter=nil>}>, :exclude_types_and_descendents=>#, :attribute_options=>#, :pointcuts=>#, :around=>#, :exclude_methods=>#, :attributes=>#}, pointcuts: ##, :types=>#, :types_and_ancestors=>#, :default_objects=>#, :methods=>#, :exclude_pointcuts=>#, :exclude_types=>#, :exclude_types_and_ancestors=>#, :objects=>#, :exclude_join_points=>#, :join_points=>#, :method_options=>#, :exclude_types_calculated=>#, :noop=>#, :exclude_objects=>#, :exclude_types_and_nested_types=>#, :types_and_nested_types=>#, :logger=>#, @progname=nil, @logdev=#, @dev=#, @shift_size=nil, @shift_age=nil, @filename=nil>, @level=2, @formatter=nil>}>, :exclude_types_and_descendents=>#, :attribute_options=>#, :exclude_methods=>#, :attributes=>#}, candidate_types: FinderResult: {matched: {A=>#}, not_matched: {}}, candidate_types_excluded: FinderResult: {matched: {}, not_matched: {}}, candidate_objects: FinderResult: {matched: {}, not_matched: {}}, join_points_matched: #, @advice_kind="unknown">}}>, join_points_not_matched: #}}>, advice: #}, @attribute_options=#, @objects=#, @default_objects=#, @noop=#, @named_pointcuts=#, @advice_kind=:around, @last_advice_node=nil, @around=#, @exclude_join_points=#, @advice=#, @methods=#, @static_join_point=JoinPoint: {target_type = A, target_object = nil, method_name = foo, instance_method? true, context = #}, @exclude_types_and_nested_types=#, @exceptions=#, @exclude_objects=#, @exclude_types_and_ancestors=#>, @block_for_method=nil, @advised_object=#, @proceed_proc=#}>, @advice_kind=:around>}) (join_point = JoinPoint: {target_type = A, target_object = nil, method_name = foo, instance_method? true, context = #, @progname=nil, @logdev=#, @dev=#, @shift_size=nil, @shift_age=nil, @filename=nil>, @level=2, @formatter=nil>}>, @join_points=#, @types_and_ancestors=#, @types_and_nested_types=#, @next_node=#}>, @exclude_pointcuts=#, @exclude_methods=#, @method_options=#, @types_and_descendents=#, @last_advice_kind=[:around], @exclude_types_and_descendents=#, @pointcuts=#, @ignore_no_matching_join_points=#, @exclude_types_calculated=[], @exclude_types=#, @attributes=#, @exclude_named_pointcuts=#, @types=#, @aspect=Aspect: {specification: {:types_and_descendents=>#, :types=>#, :advice=>#, :methods=>#, :default_objects=>#, :types_and_ancestors=>#, :exclude_pointcuts=>#, :exclude_types=>#, :named_pointcuts=>#, :exclude_types_and_ancestors=>#, :objects=>#, :exceptions=>#, :exclude_join_points=>#, :join_points=>#, :ignore_no_matching_join_points=>#, :method_options=>#, :exclude_named_pointcuts=>#, :exclude_types_calculated=>[], :noop=>#, :exclude_objects=>#, :exclude_types_and_nested_types=>#, :types_and_nested_types=>#, :logger=>#, @progname=nil, @logdev=#, @dev=#, @shift_size=nil, @shift_age=nil, @filename=nil>, @level=2, @formatter=nil>}>, :exclude_types_and_descendents=>#, :attribute_options=>#, :pointcuts=>#, :around=>#, :exclude_methods=>#, :attributes=>#}, pointcuts: ##, :types=>#, :types_and_ancestors=>#, :default_objects=>#, :methods=>#, :exclude_pointcuts=>#, :exclude_types=>#, :exclude_types_and_ancestors=>#, :objects=>#, :exclude_join_points=>#, :join_points=>#, :method_options=>#, :exclude_types_calculated=>#, :noop=>#, :exclude_objects=>#, :exclude_types_and_nested_types=>#, :types_and_nested_types=>#, :logger=>#, @progname=nil, @logdev=#, @dev=#, @shift_size=nil, @shift_age=nil, @filename=nil>, @level=2, @formatter=nil>}>, :exclude_types_and_descendents=>#, :attribute_options=>#, :exclude_methods=>#, :attributes=>#}, candidate_types: FinderResult: {matched: {A=>#}, not_matched: {}}, candidate_types_excluded: FinderResult: {matched: {}, not_matched: {}}, candidate_objects: FinderResult: {matched: {}, not_matched: {}}, join_points_matched: #, @advice_kind="unknown">}}>, join_points_not_matched: #}}>, advice: #}, @attribute_options=#, @objects=#, @default_objects=#, @noop=#, @named_pointcuts=#, @advice_kind=:around, @last_advice_node=nil, @around=#, @exclude_join_points=#, @advice=#, @methods=#, @static_join_point=JoinPoint: {target_type = A, target_object = nil, method_name = foo, instance_method? true, context = #}, @exclude_types_and_nested_types=#, @exceptions=#, @exclude_objects=#, @exclude_types_and_ancestors=#>, @block_for_method=nil, @advised_object=#, @proceed_proc=#}>, @advice_kind=:around>}) (RuntimeError) from /usr/lib64/ruby/gems/1.8/gems/aquarium-0.4.3/lib/aquarium/aspects/advice.rb:148:in `send' from /usr/lib64/ruby/gems/1.8/gems/aquarium-0.4.3/lib/aquarium/aspects/advice.rb:148:in `advice_wrapper' from /usr/lib64/ruby/gems/1.8/gems/aquarium-0.4.3/lib/aquarium/aspects/advice.rb:66:in `call' from /usr/lib64/ruby/gems/1.8/gems/aquarium-0.4.3/lib/aquarium/aspects/join_point.rb:49:in `proceed' from /usr/lib64/ruby/gems/1.8/gems/aquarium-0.4.3/lib/aquarium/aspects/join_point.rb:153:in `proceed' from aquarium-exc.rb:14 from /usr/lib64/ruby/gems/1.8/gems/aquarium-0.4.3/lib/aquarium/aspects/advice.rb:60:in `call' from /usr/lib64/ruby/gems/1.8/gems/aquarium-0.4.3/lib/aquarium/aspects/advice.rb:60:in `call_advice' from /usr/lib64/ruby/gems/1.8/gems/aquarium-0.4.3/lib/aquarium/aspects/advice.rb:251:in `advice_wrapper' from /usr/lib64/ruby/gems/1.8/gems/aquarium-0.4.3/lib/aquarium/aspects/advice.rb:66:in `call' from /usr/lib64/ruby/gems/1.8/gems/aquarium-0.4.3/lib/aquarium/aspects/aspect.rb:408:in `foo' from aquarium-exc.rb:19 ruby 1.8.5 aquarium 0.4.3