[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Overriding Kernel#raise

Shane Liesegang

8/31/2007 4:36:00 PM

I'm writing a C++ program that has a Ruby interpreter embedded in it.
I'd like to keep all Ruby-related exceptions contained within the Ruby
runtime so that I don't have to protect all my calls. Since native
objects can be subclassed by Ruby, you never know when a call is going
to result in the interpreter doing something.

To contain the exceptions, I've overridden Kernel#raise, like this:

module Kernel
alias _raise raise

def raise(*a)
begin
if a.size == 0
_raise
elsif a.size == 1
_raise(a[0])
else
_raise(a[0], a[1])
end
rescue Exception => e
$stderr.print e.class, ": ", e.message, "\n"
$stderr.puts e.backtrace unless e.backtrace.nil?
end
end
end

I can't shake the feeling that this is *dirty* and that there must be a
better way to do things. Just hoping to get some feedback on both the
concept and implementation.
--
Posted via http://www.ruby-....

3 Answers

Shane Liesegang

8/31/2007 6:04:00 PM

0

Whoops. Duh. :-)

Early on in the code I hadn't been using *a and forgot to excise those
remnants. Thanks for pointing it out.


Jason Roelofs wrote:
> The splat operator is your friend:
>
> module Kernel
> alias _raise raise
>
> def raise(*a)
> begin
> _raise(*a)
> rescue Exception => e
> $stderr.print e.class, ": ", e.message, "\n"
> $stderr.puts e.backtrace unless e.backtrace.nil?
> end
> end
> end
>
> As I've never done this or seen it done, I'm not sure how well it will
> work, but for your needs this looks fine.
>
> Jason

--
Posted via http://www.ruby-....

Arlen Cuss

8/31/2007 11:21:00 PM

0


> > module Kernel
> > alias _raise raise
> >
> > def raise(*a)
> > begin
> > _raise(*a)
> > rescue Exception => e
> > $stderr.print e.class, ": ", e.message, "\n"
> > $stderr.puts e.backtrace unless e.backtrace.nil?
> > end
> > end
> > end

I'm always a bit worried when I do this that there's a chance I'll be
aliasing my method right into someone else's aliased method. Is there
any way to do this 'safely'?

- Arlen.


Shane Liesegang

9/1/2007 1:25:00 AM

0

Arlen Christian Mart Cuss wrote:
> I'm always a bit worried when I do this that there's a chance I'll be
> aliasing my method right into someone else's aliased method. Is there
> any way to do this 'safely'?


Arlen makes a good point -- in my case all the scripting code has been
written from scratch by me, so I know that there are no such
interactions. But that doesn't mean there couldn't be.

Any better, all-encompassing way to catch all exceptions?
--
Posted via http://www.ruby-....