ES wrote: > Robert Klemme wrote: >> Daniel Berger <Daniel.Berger / qwest.com> wrote: >> >>> Hi all, >>> >>> Say I do something like this do the Exception class: >>> >>> class Exception >>> alias :old_init :initialize >>> def initialize(*args) >>> old_init(*args) >>> do_stuff >>> end >>> >>> def do_stuff >>> puts "Hello World!" >>> end >>> end >>> >>> And, I want +do_stuff+ to fire off if an error is *raised* but not >>> if it is caught (and not re-raised). In other words, I would expect >>> +do_stuff+ to fire off in this example: >>> >>> begin >>> 0/0 >>> rescue ZeroDivisionError >>> raise >>> end >>> >>> But I don't want to fire off in this example: >>> >>> begin >>> 0/0 >>> rescue ZeroDivisionError >>> # Do nothing >>> end >> >> >> The moment an exception is thrown an exception istance is created. >> So your code will be invoked on every raise. No way to prevent that >> if you put it into the constructor. > > Just 'raise' by itself seems to raise the same exception object (it > does not even #dup it I think) so the #initialize would only work > whenever an Exception is raised the first time. Right! Still that does not help to achive the behavior Daniel wanted because he wanted to prevent action for some initial raised exceptions. :-) >>> Is there a way I can accomplish this? >> >> >> Write a custom method that does the raising. >> >> def my_raise(cl,*a) >> ex = cl.new(*a) >> ex.do_stuff >> raise ex >> end Strictly speaking this suggestion of mine would not solve the problem either, as this would require to change internal code (the one that detects division by zero). But then again, there is no real solution to this problem for very fundamental reasons (especially causality): at the moment an exception is thrown it cannot know how it will be handled. You *must* do the distinction in the catch clause - if you feel you need to do it. It would be interesting to learn what real world problem Daniel wants to solve... Kind regards robert