[Q] Catching exceptions at top level

I have sort of a trivial question here that I'm afraid is so simple that I could not find the answer :frowning:

I'd like to be able to catch all unrescued exceptions raised in a Ruby script in the END block that is executed last before the script terminates. The goal is to intercept the the exception raised and process the exception message and stack trace before it is printed

Shall I redefine the raise method to do this or is there another way?

Thanks for your help!

Laurent

Laurent Julliard wrote:

I have sort of a trivial question here that I'm afraid is so simple that I could not find the answer :frowning:

I'd like to be able to catch all unrescued exceptions raised in a Ruby script in the END block that is executed last before the script terminates. The goal is to intercept the the exception raised and process the exception message and stack trace before it is printed

I think you can just edit the object that is in $!. If you want a solution without using perlish variables wrap the whole application in a rescue clause like this:

begin
   code
   more code
   and so on ...
rescue Exception => error
   do something with error
   raise # reraise the exception
end

Florian Gross wrote:

Laurent Julliard wrote:

I have sort of a trivial question here that I'm afraid is so simple that I could not find the answer :frowning:

I'd like to be able to catch all unrescued exceptions raised in a Ruby script in the END block that is executed last before the script terminates. The goal is to intercept the the exception raised and process the exception message and stack trace before it is printed

I think you can just edit the object that is in $!. If you want a solution without using perlish variables wrap the whole application in a rescue clause like this:

begin
  code
  more code
  and so on ...
rescue Exception => error
  do something with error
  raise # reraise the exception
end

The problem is that I must leave the original file containing the code unchanged so it has to be a mechanism that i can include with a piece of code added at runtime with a -r option

Laurent

路路路

--
Laurent JULLIARD
http://www.moldus.org/~laurent

In Message-Id: <41A654AB.1070002@moldus.org>
Laurent Julliard <laurent@moldus.org> writes:

The problem is that I must leave the original file containing the code
unchanged so it has to be a mechanism that i can include with a piece
of code added at runtime with a -r option

How about the following?

original.rb:
  # your original application code.

wrapper.rb:
  begin
    load("original.rb")
  rescue Exception => e
    # transform and reraise.
  end

then invoking wrapper.rb.

路路路

--
kjana@dm4lab.to November 26, 2004
Slow and steady wins the race.

Laurent Julliard <laurent@moldus.org> wrote in news:41A654AB.1070002
@moldus.org:

The problem is that I must leave the original file containing the code
unchanged so it has to be a mechanism that i can include with a piece
of code added at runtime with a -r option

The solution was there, but I will make that explicit:

catcher.rb ---------------------------------------
END {
  puts 'exception has happened.'
  p $!
}

路路路

-----------------------------------------------------

test.rb ---------------------------------------------
raise 'dodah'
-----------------------------------------------------

Call as
  ruby -rcatcher test.rb

gives you
exception has happened.
#<RuntimeError: dodah>
test.rb:1: dodah (RuntimeError)

yours, kaspar

hand manufactured code - www.tua.ch/ruby

Kaspar Schiess wrote:

Laurent Julliard <laurent@moldus.org> wrote in news:41A654AB.1070002
@moldus.org:

The problem is that I must leave the original file containing the code unchanged so it has to be a mechanism that i can include with a piece of code added at runtime with a -r option

The solution was there, but I will make that explicit:

catcher.rb ---------------------------------------
END {
  puts 'exception has happened.'
  p $!
}
-----------------------------------------------------

test.rb ---------------------------------------------
raise 'dodah'
-----------------------------------------------------

Call as ruby -rcatcher test.rb

gives you exception has happened.
#<RuntimeError: dodah>
test.rb:1: dodah (RuntimeError)

yours, kaspar

hand manufactured code - www.tua.ch/ruby

This is exactly what I was lloking for and as I suspected when I first asked the question the answer wass almost obvious :slight_smile: Thanks again

Laurent

路路路

--
Laurent JULLIARD
http://www.moldus.org/~laurent