Overriding Kernel#raise

S

Shane Liesegang

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.
 
S

Shane Liesegang

Whoops. Duh. :)

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

Shane Liesegang

Arlen said:
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?
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,773
Messages
2,569,594
Members
45,119
Latest member
IrmaNorcro
Top