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.

···

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

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

···

On 8/31/07, Shane Liesegang <shane@techie.net> wrote:

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-forum.com/\.

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 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-forum.com/\.

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

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-forum.com/\.