Overriding Kernel#raise

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.

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

Whoops. Duh. :slight_smile:

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

Jason R. 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

Arlen Christian Mart C. 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?

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.