Forum: wxRuby exception propagation in wxruby

89f9acdcbc663e41e45ce590cd746d6e?d=identicon&s=25 Fabio Petrucci (biospank)
on 2010-03-20 10:31
(Received via mailing list)
Hi all,

i don't know if it's a bug but at least, for me, incomprehensible.

try this code (plain ruby):

module A
    class MyException < StandardError; end
    def raise_ex
            raise MyException, "details.."
        rescue Exception => ex
            puts "inside module A #{ex.class}"
            raise
    end
end

class Test
    include A
    def call_test
        raise_ex
    rescue Exception => ex
        puts "inside class Test #{ex.class}"
    end
end

Test.new.call_test

i get this..

inside module A A::MyException
inside class Test A::MyException

...as expected.

try this wxruby code:

begin
  require 'rubygems'
rescue LoadError
end
require 'wx'

include Wx

module A
    class MyException < StandardError; end
    def raise_ex
            raise MyException, "details.."
        rescue Exception => ex
            puts "inside module A #{ex.class}"
            raise
    end
end

class MyFrame < Frame
    include A

    def initialize
        super(nil, -1, "Raise Exception demonstration",
            DEFAULT_POSITION, Size.new(350,200), DEFAULT_FRAME_STYLE)
        panel = Panel.new(self, -1)

        button = Button.new(panel, -1, "Raise exception",
Point.new(15,15))
        evt_button( button.get_id ) { on_raise_exception }
        evt_close { | e | on_close_window(e) }
    end

    def on_raise_exception
        raise_ex
      rescue Exception => ex
        puts "inside class MyFrame #{ex.class}"
    end

    def on_close_window(event)
      event.skip
    end
end

class MyApp < App
  def on_init
    begin
      main = MyFrame.new
      main.show
    rescue Exception => e
      exit(1)
    end
  end

end

MyApp.new.main_loop

i get this...

inside module A ArgumentError  # totally wrong error type

and even worse it doesn't propagate.

Tested on ruby 1.8.6/1.9.1, wxruby 2.0.0/2.0.1 x86-mswin32/x86-mingw32
This topic is locked and can not be replied to.